1 ;;; www-page.el --- Album page generator for page.cgi.
3 ;; Copyright (C) 2005,2006,2007,2009,2010 MORIOKA Tomohiko
5 ;; Keywords: Photo, image, album, HTML, WWW
7 ;; This file is part of Album.
9 ;; Album is free software; you can redistribute it and/or modify it
10 ;; under the terms of the GNU General Public License as published by
11 ;; the Free Software Foundation; either version 2, or (at your option)
14 ;; Album is distributed in the hope that it will be useful, but
15 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 ;; General Public License for more details.
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GNU Emacs; see the file COPYING. If not, write to the
21 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 ;; Boston, MA 02111-1307, USA.
26 ;; It requires `convert' and `identify' of ImageMagick.
30 (defconst www-page-version "0.5")
32 (defvar www-page-coding-system
37 (defvar www-page-default-base-directory
40 (defvar www-page-size-specs
57 (defun decode-url-string (string &optional coding-system)
58 (if (> (length string) 0)
61 (while (string-match "%\\([0-9A-F][0-9A-F]\\)" string i)
62 (setq dest (concat dest
63 (substring string i (match-beginning 0))
66 (string-to-int (match-string 1 string) 16))))
69 (concat dest (substring string i))
72 (defun www-page-open-dir (url-dir &optional image-root)
73 (let* ((path (expand-file-name url-dir image-root))
74 (desc-file (expand-file-name "dir.desc" path)))
75 (cons (cons 'location path)
77 (when (file-exists-p desc-file)
78 (insert-file-contents desc-file)
79 (read (current-buffer)))))))
81 (defun www-page-directory-image-files (url-dir image-root)
83 (dolist (file (directory-files (expand-file-name url-dir image-root)
84 nil "\\.\\(jpg\\|JPG\\)$" nil t))
85 (unless (string-match "_[^_]+GA[^_]*$"
86 (file-name-sans-extension file))
87 (setq source-images (cons file source-images))))
88 (nreverse source-images)))
90 (defun www-page-display-dir (url-dir &optional size image-root
91 lang title parent-url hide-cgi
93 (setq url-dir (file-name-as-directory url-dir))
94 (princ "Content-Type: text/html; charset=UTF-8
97 (let* ((params (www-page-open-dir url-dir image-root))
98 source-images ref-images
99 file i ref-file prev-file next-file file-desc
101 (when (setq title (assq 'title params))
102 (setq title (cdr title)))
105 (file-name-nondirectory
106 (substring url-dir 0 (1- (length url-dir))))))
107 (when (setq source-images (assq 'files params))
108 (setq source-images (cdr source-images)))
109 (when (setq ref-images (assq 'refs params))
110 (setq ref-images (cdr ref-images)))
111 (unless (or source-images ref-images)
113 (www-page-directory-image-files url-dir image-root)))
114 (when (setq note (assq 'note params))
115 (setq note (cdr note)))
116 (when (setq parent-url (assq 'exit params))
117 (setq parent-url (cdr parent-url)))
120 "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"
121 \"http://www.w3.org/TR/html4/loose.dtd\">\n")
124 (insert (format " lang=\"%s\"" lang)))
127 (insert (format "<title>%s</title>\n" title))
130 (insert (format "<h1>%s</h1>\n" title))
138 "[Note]
\e$B%5%`%M%$%k$r%/%j%C%/$9$k$HBg$-$J2hA|$,I=<($5$l$^$9
\e(B
143 (insert (format "lang = %s<br>\n" lang))))
144 (dolist (image-file source-images)
145 (setq file (file-name-nondirectory image-file))
146 (insert "<a href=\"")
152 (insert (format ".html.%s&size=%s&p=%s\">"
156 (insert (format "<img alt=\"%s\" src=\"" file))
158 (insert (format "img.cgi?%s" url-dir)))
160 (insert "&size=thumbnail\">")
165 (setq ref-file (car ref-images))
168 (format "%d" (1+ i))))
172 (expand-file-name url-dir image-root)))
173 (unless (file-exists-p file-desc)
177 (insert (format "(prev-file . %S)\n " prev-file)))
178 ;; (insert (format "(ref . \"%s%s\")\n "
179 ;; url-dir ref-file))
180 (insert (format "(ref . \"%s\")\n "
183 (insert (format "(next-file . %S)\n " next-file)))
185 (write-region (point-min)(point-max) file-desc)))
186 (setq file (file-name-nondirectory ref-file))
187 (insert "<a href=\"")
192 (insert (format "%d.html.%s&size=%s\">"
196 ;; (insert (format "<img alt=\"%s\" src=\"page.cgi?%s%s&size=thumbnail\">"
197 ;; file url-dir ref-file))
198 (insert (format "<img alt=\"%s\" src=\"%s&size=thumbnail\">"
201 (setq prev-file (format "%d" i))
203 ref-images (cdr ref-images)))
214 (insert (format "[<a href=\"%s\">Return</a>]\n" parent-url)))
218 Powered by MnjAlbum WWW-Page Version %s." www-page-version))
223 (encode-coding-region (point-min)(point-max) www-page-coding-system)
224 (princ (buffer-string))
227 (defun www-page-display-page (file &optional size image-root
228 lang prev-file next-file hide-cgi
231 (setq size (intern size)))
232 (if (stringp pivot-mode)
233 (setq pivot-mode (intern pivot-mode)))
235 (setq lang (intern lang)))
236 (princ "Content-Type: text/html; charset=UTF-8
241 "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"
242 \"http://www.w3.org/TR/html4/loose.dtd\">\n")
245 (insert (format " lang=\"%s\"" lang)))
248 (insert (format "<title>%s</title>\n" file))
251 ;; (insert (format "<h1>%s</h1>\n" file))
253 (let* ((desc-file (expand-file-name (concat file ".desc") image-root))
256 (when (file-exists-p desc-file)
257 (insert-file-contents desc-file)
258 (read (current-buffer)))))
262 prev-grade next-grade
265 ;; (setq dir-desc-file
266 ;; (expand-file-name "dir.desc"
267 ;; (expand-file-name (file-name-directory file)
270 (www-page-open-dir (file-name-directory file) image-root)
272 ;; (when (file-exists-p dir-desc-file)
273 ;; (insert-file-contents dir-desc-file)
274 ;; (read (current-buffer))))
276 (unless (assq 'refs params)
277 (if (setq rest (assq 'files params))
278 (setq rest (cdr rest))
280 (www-page-directory-image-files
281 (file-name-directory file) image-root)))
282 (setq ret (file-name-nondirectory file))
284 (not (string= (car rest) ret)))
285 (setq prev-file (car rest)
287 (setq next-file (car (cdr rest)))
289 (setq params (list (cons 'prev-file prev-file))))
291 (setq params (cons (cons 'next-file next-file)
293 (if (file-directory-p (file-name-directory desc-file))
295 (insert (format "%S" params))
296 ;; (princ "X-XEmacs-Message: ")
297 (write-region (point-min)(point-max) desc-file)
300 (if (setq image-ref (assq 'ref params))
301 (setq image-ref (cdr image-ref))
302 (setq image-file file))
303 (if (setq prev-file (assq 'prev-file params))
304 (setq prev-file (cdr prev-file)))
305 (if (setq next-file (assq 'next-file params))
306 (setq next-file (cdr next-file)))
307 (setq rest www-page-size-specs)
309 (setq spec (car rest))
310 (not (eq (car spec) size)))
311 (setq prev-grade (car spec)
313 (setq next-grade (car (car (cdr rest))))
315 (insert "<a href=\"")
317 (insert (format "page.cgi?%s" (file-name-directory file))))
318 (insert (format "%s.html.%s&size=%s&p=%s\">"
325 (insert "[
\e$BA0
\e(B]")
328 (insert "[Previous]")
335 (insert "<a href=\"")
337 (insert (format "page.cgi?%s" (file-name-directory file))))
338 (insert (format "%s.html.%s&size=%s&p=%s\">"
345 (insert "[
\e$B<!
\e(B]")
355 (insert "<a href=\"")
357 (insert (format "page.cgi?%s" (file-name-directory file))))
358 (insert (format "%s.html.%s&size=%s&p=%s\">"
359 (file-name-nondirectory file)
365 (insert "[
\e$B=L>.
\e(B]")
375 (insert "<a href=\"")
377 (insert (format "page.cgi?%s" (file-name-directory file))))
378 (insert (format "%s.html.%s&size=%s&p=%s\">"
379 (file-name-nondirectory file)
385 (insert "[
\e$B3HBg
\e(B]")
398 (insert "<a href=\"")
400 (insert (format "page.cgi?%s" (file-name-directory file))))
401 (insert (format "%s.html.%s&size=%s&p=%s\">"
410 (format "<img alt=\"%s\" src=\"%s&size=%s&p=%s\">"
411 file image-ref size pivot-mode))
413 (t ; (file-exists-p (expand-file-name image-file image-root))
414 (insert (format "<img alt=\"%s\" src=\"" file))
416 (insert (format "img.cgi?%s" (file-name-directory image-file))))
417 (insert (format "%s&size=%s&p=%s\">"
418 (file-name-nondirectory image-file)
426 "
\e$B2hA|%U%!%$%k
\e(B %s
\e$B$,8+IU$+$j$^$;$s!#
\e(B\n")
428 "Image file %s is not found.\n"))
439 ;; (format "<a href=\"page.cgi?%s&lang=%s&size=%s\">[index]</a>"
440 ;; (file-name-directory file)
443 (insert "<a href=\"")
445 (insert (format "page.cgi?%s" (file-name-directory file))))
446 (insert (format "&lang=%s&size=%s&p=%s\">%s</a>"
451 "[index]
\e$B$KLa$k
\e(B")
456 "
\e$B!JJQ99$7$?Bg$-$5$O0];}$5$l$^$9!K
\e(B")
461 Powered by MnjAlbum WWW-Page Version %s." www-page-version))
466 (encode-coding-region (point-min)(point-max) www-page-coding-system)
467 (princ (buffer-string))
470 (defun www-page-display-image (file &optional size image-root pivot-mode)
471 (if (stringp pivot-mode)
472 (setq pivot-mode (intern pivot-mode)))
473 (setq file (expand-file-name file image-root))
474 (when (file-exists-p file)
475 (let (file-dir file-name
476 resized-file resized-dir
478 orig-width orig-height
480 (setq size (intern size))
483 (setq spec (assq size www-page-size-specs))
484 (setq width (nth 1 spec))
485 (setq height (nth 2 spec)))
486 (setq file-dir (file-name-directory file)
487 file-name (file-name-nondirectory file))
489 (or (when (and (eq pivot-mode t)
492 (call-process "identify" nil t nil file)
493 (goto-char (point-min))
494 (if (re-search-forward
495 "^[^ ]+ [^ ]+ \\([0-9]+\\)x\\([0-9]+\\) " nil t)
496 (setq orig-width (string-to-int
498 orig-height (string-to-int
500 (if (> orig-height orig-width)
505 (file-name-sans-extension file)
507 (file-name-extension file)))
508 (unless (file-exists-p resized-file)
514 (format "%s%s" size size-opt)
516 (unless (file-exists-p resized-file)
518 (unless (file-exists-p resized-dir)
519 (make-directory resized-dir))
522 "convert" nil nil nil
525 (format "%dx%d>" height width)
526 (format "%dx%d>" width height))
528 ;; (princ resized-file)
529 (setq file resized-file)
534 (princ (format "Content-Type: %s"
541 (let ((coding-system-for-read 'binary)
542 (coding-system-for-write 'binary))
543 (insert-file-contents-literally file))
544 (buffer-string)))))))
546 (defun www-page-batch-get ()
547 ;; (set-coding-priority-list
548 ;; '(iso-7 iso-8-2 utf-8 big5 shift-jis
549 ;; iso-8-designate iso-8-1 iso-lock-shift no-conversion))
550 ;; (set-coding-category-system 'utf-8 'utf-8-jp)
551 (let (target params method size pivot-mode key image-root lang ret hide-cgi)
552 (let ((rest (car command-line-args-left))
555 (setq rest (split-string rest "&")))
556 (setq target (car rest)
559 (when (and (string-match "=" (setq arg (car rest)))
560 (> (length (setq val (substring arg (match-end 0)))) 0))
561 (setq key (substring arg 0 (match-beginning 0)))
564 (cons (decode-url-string val www-page-coding-system)
565 (cdr (assoc key params)))))
566 (setq rest (cdr rest))))
569 ((string-match "\\.html\\(\\.\\([a-z]+\\)\\)?$" target)
570 (setq lang (match-string 2 target))
571 (setq target (substring target 0 (match-beginning 0)))
572 (cond ((string= (file-name-nondirectory
573 ;; (substring target 0 (match-beginning 0))
577 (setq target (file-name-directory target))
582 ((or (string= (file-name-nondirectory target) "")
583 (null (file-name-extension target)))
585 ;; (setq file (car (cdr (assoc "file" params))))
586 (setq size (or (car (cdr (assoc "size" params)))
589 (if (setq ret (cdr (assoc "p" params)))
590 (setq pivot-mode (car ret)))
591 (if (setq ret (cdr (assoc "lang" params)))
592 (setq lang (car ret)))
593 (setq command-line-args-left (cdr command-line-args-left))
594 (setq hide-cgi (string= (car command-line-args-left) "hide-cgi"))
595 (setq command-line-args-left (cdr command-line-args-left))
596 (setq image-root (or (car command-line-args-left)
598 www-page-default-base-directory
600 (setq command-line-args-left (cdr command-line-args-left))
601 (cond ((eq method 'dir)
602 (www-page-display-dir target size image-root lang
603 nil nil hide-cgi pivot-mode)
606 (www-page-display-page target size image-root lang
607 nil nil hide-cgi pivot-mode)
610 (www-page-display-image target size image-root pivot-mode)
617 ;;; www-page.el ends here