fixed.
[elisp/album.git] / www-page.el
index 1682d09..30fe875 100644 (file)
@@ -1,6 +1,6 @@
 ;;; www-page.el --- Album page generator for page.cgi.
 
-;; Copyright (C) 2005,2006 MORIOKA Tomohiko
+;; Copyright (C) 2005,2006,2007,2009,2010 MORIOKA Tomohiko
 
 ;; Keywords: Photo, image, album, HTML, WWW
 
@@ -27,6 +27,8 @@
 
 ;;; Code:
 
+(defconst www-page-version "0.5")
+
 (defvar www-page-coding-system
   (if (featurep 'chise)
       'utf-8-jp-er
@@ -41,7 +43,7 @@
     (VGA        640  480)
     (SVGA       800  600)
     (XGA       1024  768)
-    (WXGA      1280  768)
+    (WXGA      1280  800)
     (SXGA      1280 1024)
     (SXGA+     1400 1050)
     (WSXGA+    1680 1050)
@@ -49,6 +51,7 @@
     (WUXGA     1920 1200)
     (QXGA      2048 1536)
     (WQXGA     2560 1600)
+    (original   nil  nil)
     ))
 
 (defun decode-url-string (string &optional coding-system)
         (concat dest (substring string i))
         coding-system))))
 
-(defun www-page-display-thumbnails (url-dir &optional size image-root
-                                            lang title parent-url)
-  (setq url-dir (file-name-as-directory url-dir))
-  (let* ((desc-file
-         (expand-file-name "dir.desc"
-                           (expand-file-name url-dir image-root)))
-        (params
+(defun www-page-open-dir (url-dir &optional image-root)
+  (let* ((path (expand-file-name url-dir image-root))
+        (desc-file (expand-file-name "dir.desc" path)))
+    (cons (cons 'location path)
          (with-temp-buffer
            (when (file-exists-p desc-file)
              (insert-file-contents desc-file)
-             (read (current-buffer)))))
-        source-images
-        file
+             (read (current-buffer)))))))
+
+(defun www-page-directory-image-files (url-dir image-root)
+  (let (source-images)
+    (dolist (file (directory-files (expand-file-name url-dir image-root)
+                                  nil "\\.\\(jpg\\|JPG\\)$" nil t))
+      (unless (string-match "_[^_]+GA[^_]*$"
+                           (file-name-sans-extension file))
+       (setq source-images (cons file source-images))))
+    (nreverse source-images)))
+      
+(defun www-page-display-dir (url-dir &optional size image-root
+                                    lang title parent-url hide-cgi
+                                    pivot-mode)
+  (setq url-dir (file-name-as-directory url-dir))
+  (princ "Content-Type: text/html; charset=UTF-8
+
+")
+  (let* ((params (www-page-open-dir url-dir image-root))
+        source-images ref-images
+        file i ref-file prev-file next-file file-desc
         note)
     (when (setq title (assq 'title params))
       (setq title (cdr title)))
             (substring url-dir 0 (1- (length url-dir))))))
     (when (setq source-images (assq 'files params))
       (setq source-images (cdr source-images)))
+    (when (setq ref-images (assq 'refs params))
+      (setq ref-images (cdr ref-images)))
+    (unless (or source-images ref-images)
+      (setq source-images
+           (www-page-directory-image-files url-dir image-root)))
     (when (setq note (assq 'note params))
       (setq note (cdr note)))
     (when (setq parent-url (assq 'exit params))
       (insert "</head>\n")
       (insert "<body>\n")
       (insert (format "<h1>%s</h1>\n" title))
-
       (insert "
 <hr>
 ")
+      (cond
+       ((or (eq lang 'ja)
+           (string= lang "ja"))
+       (insert
+        "[Note] \e$B%5%`%M%$%k$r%/%j%C%/$9$k$HBg$-$J2hA|$,I=<($5$l$^$9\e(B
+<hr>
+")
+       )
+       (t
+       (insert (format "lang = %s<br>\n" lang))))
       (dolist (image-file source-images)
        (setq file (file-name-nondirectory image-file))
-       (insert "<a href=\"page.cgi?")
-       (insert url-dir)
+       (insert "<a href=\"")
+       (unless hide-cgi
+         (insert "page.cgi?")
+         (insert url-dir)
+         )
        (insert file)
-       (insert (format ".html.%s&size=%s\">"
+       (insert (format ".html.%s&size=%s&p=%s\">"
                        (or lang 'en)
-                       (or size 'VGA)))
-       (insert (format "<img alt=\"%s\" src=\"page.cgi?%s%s&size=thumbnail\">"
-                       file url-dir file))
+                       (or size 'VGA)
+                       (or pivot-mode t)))
+        (insert (format "<img alt=\"%s\" src=\"" file))
+       (unless hide-cgi
+         (insert (format "img.cgi?%s"  url-dir)))
+       (insert file)
+       (insert "&size=thumbnail\">")
        (insert "</a>\n"))
 
+      (setq i 1)
+      (while ref-images
+       (setq ref-file (car ref-images))
+       (setq next-file
+             (if (cdr ref-images)
+                 (format "%d" (1+ i))))
+       (setq file-desc
+             (expand-file-name
+              (format "%d.desc" i)
+              (expand-file-name url-dir image-root)))
+       (unless (file-exists-p file-desc)
+         (with-temp-buffer
+           (insert "(")
+           (if prev-file
+               (insert (format "(prev-file . %S)\n " prev-file)))
+            ;; (insert (format "(ref . \"%s%s\")\n "
+            ;;                 url-dir ref-file))
+           (insert (format "(ref . \"%s\")\n "
+                           ref-file))
+           (if next-file
+               (insert (format "(next-file . %S)\n " next-file)))
+           (insert "))\n")
+           (write-region (point-min)(point-max) file-desc)))
+       (setq file (file-name-nondirectory ref-file))
+       (insert "<a href=\"")
+       (unless hide-cgi
+         (insert "page.cgi?")
+         (insert url-dir)
+         )
+       (insert (format "%d.html.%s&size=%s\">"
+                       i
+                       (or lang 'en)
+                       (or size 'VGA)))
+        ;; (insert (format "<img alt=\"%s\" src=\"page.cgi?%s%s&size=thumbnail\">"
+        ;;                 file url-dir ref-file))
+       (insert (format "<img alt=\"%s\" src=\"%s&size=thumbnail\">"
+                       file ref-file))
+       (insert "</a>\n")
+       (setq prev-file (format "%d" i))
+       (setq i (1+ i)
+             ref-images (cdr ref-images)))
+
       (when note
        (insert "<p>")
        (insert note))
       (if parent-url
          (insert (format "[<a href=\"%s\">Return</a>]\n" parent-url)))
       
+      (insert 
+       (format "<hr>
+Powered by MnjAlbum WWW-Page Version %s." www-page-version))
       (insert "
 </body>
 </html>
 ")
       (encode-coding-region (point-min)(point-max) www-page-coding-system)
-      (princ "Content-Type: text/html; charset=UTF-8
-
-")
       (princ (buffer-string))
       )))
 
 (defun www-page-display-page (file &optional size image-root
-                                   lang prev-file next-file)
+                                  lang prev-file next-file hide-cgi
+                                  pivot-mode)
   (if (stringp size)
       (setq size (intern size)))
+  (if (stringp pivot-mode)
+      (setq pivot-mode (intern pivot-mode)))
   (if (stringp lang)
       (setq lang (intern lang)))
   (princ "Content-Type: text/html; charset=UTF-8
              (when (file-exists-p desc-file)
                (insert-file-contents desc-file)
                (read (current-buffer)))))
-          dir-desc-file
+           ;; dir-desc-file
+          image-file image-ref
           prev-file next-file
           prev-grade next-grade
           rest spec ret)
       (unless params
-       (setq dir-desc-file
-             (expand-file-name "dir.desc"
-                               (expand-file-name (file-name-directory file)
-                                                 image-root)))
+        ;; (setq dir-desc-file
+        ;;       (expand-file-name "dir.desc"
+        ;;                         (expand-file-name (file-name-directory file)
+        ;;                                           image-root)))
        (setq params
+             (www-page-open-dir (file-name-directory file) image-root)
+              ;; (with-temp-buffer
+              ;;   (when (file-exists-p dir-desc-file)
+              ;;     (insert-file-contents dir-desc-file)
+              ;;     (read (current-buffer))))
+             )
+       (unless (assq 'refs params)
+         (if (setq rest (assq 'files params))
+             (setq rest (cdr rest))
+           (setq rest
+                 (www-page-directory-image-files
+                  (file-name-directory file) image-root)))
+         (setq ret (file-name-nondirectory file))
+         (while (and rest
+                     (not (string= (car rest) ret)))
+           (setq prev-file (car rest)
+                 rest (cdr rest)))
+         (setq next-file (car (cdr rest)))
+         (if prev-file
+             (setq params (list (cons 'prev-file prev-file))))
+         (if next-file
+             (setq params (cons (cons 'next-file next-file)
+                                params)))
+         (if (file-directory-p (file-name-directory desc-file))
              (with-temp-buffer
-               (when (file-exists-p dir-desc-file)
-                 (insert-file-contents dir-desc-file)
-                 (read (current-buffer)))))
-       (when (setq rest (assq 'files params))
-         (setq rest (cdr rest)))
-       (setq ret (file-name-nondirectory file))
-       (while (and rest
-                   (not (string= (car rest) ret)))
-         (setq prev-file (car rest)
-               rest (cdr rest)))
-       (setq next-file (car (cdr rest)))
-       (if prev-file
-           (setq params (list (cons 'prev-file prev-file))))
-       (if next-file
-           (setq params (cons (cons 'next-file next-file)
-                              params)))
-       (with-temp-buffer
-         (insert (format "%S" params))
-          ;; (princ "X-XEmacs-Message: ")
-         (write-region (point-min)(point-max) desc-file)
-          ;; (princ "\n")
-         ))
+               (insert (format "%S" params))
+               ;; (princ "X-XEmacs-Message: ")
+               (write-region (point-min)(point-max) desc-file)
+               ;; (princ "\n")
+               ))))
+      (if (setq image-ref (assq 'ref params))
+         (setq image-ref (cdr image-ref))
+       (setq image-file file))
       (if (setq prev-file (assq 'prev-file params))
          (setq prev-file (cdr prev-file)))
       (if (setq next-file (assq 'next-file params))
        (setq prev-grade (car spec)
              rest (cdr rest)))
       (setq next-grade (car (car (cdr rest))))
-      (if prev-file
-         (insert (format "<a href=\"page.cgi?%s%s.html.%s&size=%s\">"
-                         (file-name-directory file) prev-file
-                         (or lang 'en)
-                         size)))
+      (when prev-file
+        (insert "<a href=\"")
+       (unless hide-cgi
+         (insert (format "page.cgi?%s" (file-name-directory file))))
+       (insert (format "%s.html.%s&size=%s&p=%s\">"
+                       prev-file
+                       (or lang 'en)
+                       size
+                       pivot-mode))
+       )
       (cond ((eq lang 'ja)
             (insert "[\e$BA0\e(B]")
             )
          (insert "</a>"))
       (insert "\n")
 
-      (if next-file
-         (insert (format "<a href=\"page.cgi?%s%s.html.%s&size=%s\">"
-                         (file-name-directory file) next-file
-                         (or lang 'en)
-                         size)))
+      (when next-file
+        (insert "<a href=\"")
+       (unless hide-cgi
+         (insert (format "page.cgi?%s" (file-name-directory file))))
+       (insert (format "%s.html.%s&size=%s&p=%s\">"
+                       next-file
+                       (or lang 'en)
+                       size
+                       pivot-mode))
+       )
       (cond ((eq lang 'ja)
             (insert "[\e$B<!\e(B]")
             )
          (insert "</a>"))
       (insert "\n")
 
-      (if prev-grade
-         (insert (format "<a href=\"page.cgi?%s.html.%s&size=%s\">"
-                         file
-                         (or lang 'en)
-                         prev-grade)))
+      (when prev-grade
+       (insert "<a href=\"")
+       (unless hide-cgi
+         (insert (format "page.cgi?%s" (file-name-directory file))))
+       (insert (format "%s.html.%s&size=%s&p=%s\">"
+                       (file-name-nondirectory file)
+                       (or lang 'en)
+                       prev-grade
+                       pivot-mode))
+       )
       (cond ((eq lang 'ja)
             (insert "[\e$B=L>.\e(B]")
             )
          (insert "</a>"))
       (insert "\n")
 
-      (if next-grade
-         (insert (format "<a href=\"page.cgi?%s.html.%s&size=%s\">"
-                         file
-                         (or lang 'en)
-                         next-grade)))
+      (when next-grade
+        (insert "<a href=\"")
+       (unless hide-cgi
+         (insert (format "page.cgi?%s" (file-name-directory file))))
+       (insert (format "%s.html.%s&size=%s&p=%s\">"
+                       (file-name-nondirectory file)
+                       (or lang 'en)
+                       next-grade
+                       pivot-mode))
+       )
       (cond ((eq lang 'ja)
             (insert "[\e$B3HBg\e(B]")
             )
       (insert "
 <hr>
 ")
-      (if next-file
-         (insert (format "<a href=\"page.cgi?%s%s.html.%s&size=%s\">"
-                         (file-name-directory file) next-file
-                         (or lang 'en)
-                         size)))
-      (insert (format "<img alt=\"%s\" src=\"page.cgi?%s&size=%s\">"
-                     file file size))
+      (when next-file
+       (insert "<a href=\"")
+       (unless hide-cgi
+         (insert (format "page.cgi?%s" (file-name-directory file))))
+       (insert (format "%s.html.%s&size=%s&p=%s\">"
+                       next-file
+                       (or lang 'en)
+                       size
+                       pivot-mode))
+       )
+      (cond
+       (image-ref
+       (insert
+        (format "<img alt=\"%s\" src=\"%s&size=%s&p=%s\">"
+                file image-ref size pivot-mode))
+       )
+       (t ; (file-exists-p (expand-file-name image-file image-root))
+       (insert (format "<img alt=\"%s\" src=\"" file))
+       (unless hide-cgi
+         (insert (format "img.cgi?%s" (file-name-directory image-file))))
+       (insert (format "%s&size=%s&p=%s\">"
+                       (file-name-nondirectory image-file)
+                       size pivot-mode))
+       )
+       (t
+       (insert "<p>")
+       (insert (format
+                (cond
+                 ((eq lang 'ja)
+                  "\e$B2hA|%U%!%$%k\e(B %s \e$B$,8+IU$+$j$^$;$s!#\e(B\n")
+                 (t
+                  "Image file %s is not found.\n"))
+                file))))
+      
       (if next-file
          (insert "</a>"))
-      (insert "
+      )
+    (insert "
 <hr>
 
 ")
-      (insert
-       (format "<a href=\"page.cgi?%s&lang=%s&size=%s\">[index]</a>"
-              (file-name-directory file)
-              (or lang 'en)
-              size))
-      (insert "
+    ;; (insert
+    ;;  (format "<a href=\"page.cgi?%s&lang=%s&size=%s\">[index]</a>"
+    ;;          (file-name-directory file)
+    ;;          (or lang 'en)
+    ;;          size))
+    (insert "<a href=\"")
+    (unless hide-cgi
+      (insert (format "page.cgi?%s" (file-name-directory file))))
+    (insert (format "&lang=%s&size=%s&p=%s\">%s</a>"
+                   (or lang 'en)
+                   size
+                   pivot-mode
+                   (cond ((eq lang 'ja)
+                          "[index] \e$B$KLa$k\e(B")
+                         (t
+                          "[index]"))))
+    (insert
+     (cond ((eq lang 'ja)
+           "\e$B!JJQ99$7$?Bg$-$5$O0];}$5$l$^$9!K\e(B")
+          (t
+           "")))
+    (insert 
+     (format "<hr>
+Powered by MnjAlbum WWW-Page Version %s." www-page-version))
+    (insert "
 </body>
 </html>
-"))
+")
     (encode-coding-region (point-min)(point-max) www-page-coding-system)
     (princ (buffer-string))
     ))
 
-(defun www-page-display-image (file &optional size image-root)
+(defun www-page-display-image (file &optional size image-root pivot-mode)
+  (if (stringp pivot-mode)
+      (setq pivot-mode (intern pivot-mode)))
   (setq file (expand-file-name file image-root))
-  (let (file-dir file-name
-       resized-file resized-dir
-       spec)
-    (cond
-     (size
-      (setq file-dir (file-name-directory file)
-           file-name (file-name-nondirectory file))
-      (setq resized-file
-           (expand-file-name
-            file-name
-            (setq resized-dir
-                  (expand-file-name
-                   size file-dir))))
-      (unless (file-exists-p resized-file)
-       (setq size (intern size))
-       (if (setq spec (assq size www-page-size-specs))
-           (progn
-             (condition-case nil
-                 (unless (file-exists-p resized-dir)
-                   (make-directory resized-dir))
-               (error nil))
-             (call-process
-              "convert" nil nil nil
-              "-resize" (format "%dx%d>" (nth 1 spec)(nth 2 spec))
-              file resized-file)
-             )
-         (setq resized-file file)))
-      ;; (princ resized-file)
-      (setq file resized-file)
-      )
-     (t
-      ;; (princ file)
-      ))
-    (princ (format "Content-Type: %s"
-                  (with-temp-buffer
-                    (call-process
-                     "file"
-                     nil t t
-                     "-b" "--mime" file)
-                    (insert "\n")
-                    (let ((coding-system-for-read 'binary)
-                          (coding-system-for-write 'binary))
-                      (insert-file-contents-literally file))
-                    (buffer-string))))))
+  (when (file-exists-p file)
+    (let (file-dir file-name
+                  resized-file resized-dir
+                  spec width height
+                  orig-width orig-height
+                  size-opt)
+      (setq size (intern size))
+      (cond
+       ((and size
+            (setq spec (assq size www-page-size-specs))
+            (setq width (nth 1 spec))
+            (setq height (nth 2 spec)))
+       (setq file-dir (file-name-directory file)
+             file-name (file-name-nondirectory file))
+       (setq size-opt
+             (or (when (and (eq pivot-mode t)
+                            (> width height))
+                   (with-temp-buffer
+                     (call-process "identify" nil t nil file)
+                     (goto-char (point-min))
+                     (if (re-search-forward
+                          "^[^ ]+ [^ ]+ \\([0-9]+\\)x\\([0-9]+\\) " nil t)
+                         (setq orig-width (string-to-int
+                                           (match-string 1))
+                               orig-height (string-to-int
+                                            (match-string 2)))))
+                   (if (> orig-height orig-width)
+                       'p))
+                 ""))
+       (setq resized-file
+             (format "%s_%s%s.%s"
+                     (file-name-sans-extension file)
+                     size size-opt
+                     (file-name-extension file)))
+       (unless (file-exists-p resized-file)
+         (setq resized-file
+               (expand-file-name
+                file-name
+                (setq resized-dir
+                      (expand-file-name
+                       (format "%s%s" size size-opt)
+                       file-dir))))
+         (unless (file-exists-p resized-file)
+           (condition-case nil
+               (unless (file-exists-p resized-dir)
+                 (make-directory resized-dir))
+             (error nil))
+           (call-process
+            "convert" nil nil nil
+            "-resize"
+            (if (eq size-opt 'p)
+                (format "%dx%d>" height width)
+              (format "%dx%d>" width height))
+            file resized-file)))
+       ;; (princ resized-file)
+       (setq file resized-file)
+       )
+       (t
+       ;; (princ file)
+       ))
+      (princ (format "Content-Type: %s"
+                    (with-temp-buffer
+                      (call-process
+                       "file"
+                       nil t t
+                       "-b" "--mime" file)
+                      (insert "\n")
+                      (let ((coding-system-for-read 'binary)
+                            (coding-system-for-write 'binary))
+                        (insert-file-contents-literally file))
+                      (buffer-string)))))))
 
 (defun www-page-batch-get ()
   ;; (set-coding-priority-list
   ;;  '(iso-7 iso-8-2 utf-8 big5 shift-jis
   ;;          iso-8-designate iso-8-1 iso-lock-shift no-conversion))
   ;; (set-coding-category-system 'utf-8 'utf-8-jp)
-  (let (target params method size key image-root lang ret)
+  (let (target params method size pivot-mode key image-root lang ret hide-cgi)
     (let ((rest (car command-line-args-left))
          arg val)
       (if rest
                (null (file-name-extension target)))
            'dir)))
     ;; (setq file (car (cdr (assoc "file" params))))
-    (setq size (car (cdr (assoc "size" params))))
+    (setq size (or (car (cdr (assoc "size" params)))
+                  'VGA))
+    (setq pivot-mode t)
+    (if (setq ret (cdr (assoc "p" params)))
+       (setq pivot-mode (car ret)))
     (if (setq ret (cdr (assoc "lang" params)))
        (setq lang (car ret)))
     (setq command-line-args-left (cdr command-line-args-left))
+    (setq hide-cgi (string= (car command-line-args-left) "hide-cgi"))
+    (setq command-line-args-left (cdr command-line-args-left))
     (setq image-root (or (car command-line-args-left)
                         (expand-file-name
                          www-page-default-base-directory
                          default-directory)))
     (setq command-line-args-left (cdr command-line-args-left))
     (cond ((eq method 'dir)
-          (www-page-display-thumbnails target size image-root lang)
+          (www-page-display-dir target size image-root lang
+                                nil nil hide-cgi pivot-mode)
           )
          ((eq method 'page)
-          (www-page-display-page target size image-root lang)
+          (www-page-display-page target size image-root lang
+                                 nil nil hide-cgi pivot-mode)
           )
          (t
-          (www-page-display-image target size image-root)
+          (www-page-display-image target size image-root pivot-mode)
           )
          )))