home *** CD-ROM | disk | FTP | other *** search
/ kermit.columbia.edu / kermit.columbia.edu.tar / kermit.columbia.edu / scripts / ckermit / photoalbum.~5~ < prev    next >
Text File  |  2010-08-07  |  16KB  |  402 lines

  1. #!/p/kd/fdc/solaris9/wermit +
  2. #
  3. # Usage: photoalbum.ksc [ keyword=value [ keyword=value [ ... ] ] ]
  4. #
  5. # Make web site of pictures, which must be jpg's.
  6. # To use, put the desired jpg's in an empty directory,
  7. # cd to the directory, and run this script with the desired arguments:
  8. #
  9. # Makes an index page with thumbnails (or picture filenames if there are
  10. # no thumbnails) and then a page for each picture with forward, back, and
  11. # index links, with the ability to click on each picture to see the original.
  12. # Page can be in Spanish or English.
  13. #
  14. # Options (keywords):
  15. #   title="This will be the title" (enclose in quotes if multiple words)
  16. #   color=xxx      (foreground text color, default dargmagenta)
  17. #   background=yyy (background color, default #fff0f0)
  18. #   language=zzz   (english or spanish, default english)
  19. #   height=nnn     (height for thumbnails in pixels, default 120)
  20. #   noscale=n      (0 to scale photos, 1 not to scale, default 0)
  21. #   resize=n       (resize originals, n = max width or height, pixels)
  22. #   arrows         (put Unicode triangles for navigation instead of words)
  23. #   shorttitle="short title for photos" (default is full title)
  24. #
  25. # NOTE: For the present, keywords must be spelled out in full.
  26. #
  27. # The shorttitle is used in the alt= and title= clause of each photo.
  28. # If no shorttitle is given, the regular title is used.
  29. #
  30. # Overwrites any previous versions of the .html pages each time you run it.
  31. #
  32. # If ImageMagick is available, it is used to generate thumbnails for the
  33. # index page.  Otherwise the index page just contains a list of links to
  34. # the individual HTML pages.  ImageMagick can be found here:
  35. #
  36. #   http://www.imagemagick.org/
  37. #
  38. # Alternatively if you can make thumbnails some other way, they will be used
  39. # if they are already there.  For each file xxx.jpg, the corresponding
  40. # thumbnail must be called xxx-t.jpg; all thumbnails should be the same height.
  41. #
  42. # Frank da Cruz, Columbia University, 9 July 2006
  43. #
  44. # Updates:
  45. # 10 Jul 2006: Fixed some typos and fixed the test for Windows.
  46. # 11 Jul 2006: Added RESIZE option (RESIZE=n, pixels, default=760).
  47. # 11 Jul 2006: Reduced disk size of thumbnails by factor of 10.
  48. # 12 Jul 2006: Don't give HTML HEIGHT or WIDTH directives for resized images.
  49. # 12 Jul 2006: Keep and link to original when resizing rather than replacing.
  50. # 15 Sep 2006: Fix NOSCALE result; add "arrows" option for navigation links.
  51. # 16 Nov 2006: Colors for links; fix help text; allow "-help".
  52. # 12 Dec 2009: Nicer default colors; give usage message if no arguments.
  53. # 07 Aug 2010: Put alts and better titles on images; new default colors
  54.  
  55. .myname := \fbasename(\%0)              # Filename of this script
  56.  
  57. if eq "\v(system)" "unix" {             # Check prerequisites
  58.     local msg
  59.     .msg = C-Kermit 8.0.212 Dev.20 or later required.
  60.     if llt \v(version) 800212 exit 1 \m(msg)
  61.     if < \v(buildid) 20060707 exit 1 \m(msg)
  62. }
  63. if eq "\v(system)" "windows" {
  64.     if <= \v(xversion) 2103 {
  65.         echo
  66.         echo WARNING:
  67.         echo Certain functions in this script won't work in Windows but a fully
  68.         echo functional website should still result. Ignore any error messages.
  69.         echo This script will operate correctly in the next release of K95.
  70.         echo
  71.     }
  72. }
  73. def USAGE {
  74.     echo
  75.     echo { Usage: \m(myname) keyword=value [ keyword=value [ ... ] ]}
  76.     echo
  77.     echo { Makes a website in a directory containing .jpg images.}
  78.     echo { Index page shows thumbnails of the images.}
  79.     echo
  80.     echo { Options (keywords):}
  81.     echo {   title="This will be the title"}
  82.     echo {   color=xxx      (foreground text color, default darkmagenta)}
  83.     echo {   background=yyy (background color, default \#fff0f0)}
  84.     echo {   language=zzz   (english or spanish, default english)}
  85.     echo {   height=nnn     (height for thumbnails in pixels, default 72)}
  86.     echo {   noscale=n      (0 to scale photos, 1 not to scale, default 0)}
  87.     echo {   resize=n       (nonzero n means resize pictures to n pixels)}
  88.     echo {   arrows         (use arrows instead "next" and "previous")}
  89.     echo {   help           (print this message)}
  90.     echo {   shorttitle="short title for photos" (default is full title)}
  91.     echo
  92.     exit 0
  93. }
  94. if < \v(argc) 2 usage
  95.  
  96. .kerbang = 0                            # How we exit depends on how invoked
  97. if kerbang incr kerbang                 # (This only works at top level)
  98. define FATAL {                          # Fatal error macro
  99.     fclose all                          # Close all open files
  100.     echo                                # and exit or stop with given message
  101.     if \m(kerbang) exit 1 FATAL - \%*
  102.     else stop 1 FATAL - \%*
  103. }
  104. def STYLE {                # Write <style>..</style> stanza
  105.     fwrite /line \%1 <style type="text/css">
  106.     if \m(arrows) {
  107.     fwrite /line \%1 "  a { text-decoration:none }"
  108.     }
  109.     fwrite /line \%1 "  a:link { color:\m(color) }"
  110.     fwrite /line \%1 "  a:visited { color:\m(color) }"
  111.     fwrite /line \%1 "  a:hover { color:\m(hover) }"
  112.     fwrite /line \%1 "  a:active { color:\m(hover) }"
  113.     fwrite /line \%1 "  img { border:2px solid \m(color) }"
  114.     fwrite /line \%1 </style>
  115. }
  116. # Command-line processing - title and options
  117.  
  118. .height = 120                # Default thumbnail height
  119. .language = English            # Default text language
  120. .color = darkmagenta                       # Default text language
  121. .background = \#fff0f0            # Default background color
  122.  
  123. .lp = (                    # Left paren
  124. .rp = )                    # Right paren
  125.  
  126. for \%i 1 \v(argc)-1 1 {                # Parse each keyword option
  127.     void \fkeywordvalue(\&_[\%i])    # This function does it
  128.     if eq "\v(lastkwval)" "help" usage    # If keyword was "help" give help
  129.     if eq "\v(lastkwval)" "-help" usage    # If keyword was "-help" give help
  130.     if eq "\v(lastkwval)" "-h" usage    # If keyword was "-h" give help
  131.     if eq "\v(lastkwval)" "resize" {    # If "resize" given without argument
  132.         if not def resize .resize = 720 # supply default.
  133.     }
  134.     if eq "\v(lastkwval)" "noscale" {    # If "noscale" given without argument
  135.         if not def noscale .noscale = 1 # supply default.
  136.     }
  137.     if eq "\v(lastkwval)" "arrows" {    # If "arrows" given without argument
  138.         if not def arrows .arrows = 1   # supply default.
  139.     }
  140. }
  141. stop
  142.  
  143. if not def resize .resize = 0
  144. if not def noscale .noscale = 0
  145. if not def arrows .arrows = 0
  146. if not numeric \m(height) exit 1 Fatal - Height not numeric: \m(height)
  147. if not numeric \m(noscale) exit 1 Fatal - Noscale not numeric: \m(noscale)
  148.  
  149. if match english \m(language)* .language = English
  150. else if match spanish \m(language)* .language = Spanish
  151. else exit 1 Fatal - Language "\m(language)" not supported
  152.  
  153. .hover := \m(color)
  154. switch \m(color) {
  155.   :darkmagenta, .hover = fuchsia, break
  156.   :deeppink,    .hover = pink, break
  157.   :gold,  .hover = yellow, break
  158.   :black, .hover = lightgrey, break
  159.   :blue,  .hover = lightblue, break
  160.   :red,   .hover = pink
  161. }
  162. show macro title color background hover language height noscale resize arrows
  163.  
  164. undef \%h \%w                # Height and width clauses for HTML
  165. if not \m(noscale) {
  166.     .\%h = { height="90%"}        # Portrait
  167.     .\%w = { width="100%"}        # Landscape
  168. }
  169. pwd
  170.  
  171. # Use Image Magick 'convert' (if available) to create resize originals
  172. # and/or create thumbnails.
  173.  
  174. dir /array:&t /except:*-[tr].jpg *.jpg  # Get list of original images
  175. if not \fdimension(&t) fatal No original JPGs found - nothing to do.
  176.  
  177. if eq \v(system) unix chmod 664 *.jpg
  178.  
  179. .need_thumbnails = 0                    # Assume we don't need thumbnails
  180. if def height .need_thumbnails = 1      # If height given maybe we do
  181. if not \m(need_thumbnails) {            # Or...
  182.     .\%t := \ffiles(*-t.jpg)            # if we don't have a thumbnail for
  183.     if > \&t[0] \%t .need_thumbnails = 1 # every non-thumbnail
  184. }
  185. .have_convert = 0                       # Assume we don't have 'convert'
  186. if \m(need_thumbnails) {                # Need thumbnails.
  187.     !convert -version > /dev/null       # Do we have Image Magick convert?
  188.     if fail {
  189.     echo Image Magick 'convert' not found - can't make thumbnails...
  190.         .need_thumbnails = 0            # No - can't make thumbnails
  191.     } else {
  192.         .have_convert = 1
  193.     }
  194. }
  195. if ( \m(resize) && \m(have_convert) ) { # Resizing originals
  196.     echo Resizing...
  197.     for i 1 \&t[0] 1 {                  # Go through non-thumbnail jpgs...
  198.         .t := \fstripx(\fbasename(\&t[i]),.)-r.jpg # Name for resized version
  199.         if not exist \m(t) {            # If it doesn't exist
  200.             copy \&t[i] \m(t)           # copy original
  201.         }
  202.         .\%9 := \fpictureinfo(\m(t),&d) # Get current size
  203.         if == \m(resize) \&d[\%9] {     # If it's already the desired size
  204.             echo \m(t) SKIPPED          # don't resize it.
  205.             continue
  206.         }
  207.         xecho \m(t): \fsize(\m(t))...   # Resize the copy
  208.         !convert \m(t) -resize \m(resize)x\m(resize) \m(t)
  209.         if fail echo PROBLEM RESIZING \&t[i] - Continuing...
  210.         echo \fsize(\m(t))
  211.         chmod 644 \m(t)
  212.     }
  213.     echo                                # Done with thumbnails
  214. }
  215. if \m(need_thumbnails) {                # Need to and can make thumbnails...
  216.     echo Checking thumbnails...
  217.     for i 1 \&t[0] 1 {                  # Go through non-thumbnail jpgs...
  218.         .t := \fstripx(\fbasename(\&t[i]),.)
  219.         .tt := \m(t)-t.jpg              # Make name for thumbnail
  220.         if exist \m(tt) {               # Already exists?
  221.             if \fpictureinfo(\m(tt),&d) { # get its height
  222.                 if ( == \m(height) \&d[2] ) { # Same as requested height?
  223.                     continue                  # Nothing to do
  224.                 }
  225.             }
  226.             del /quiet \m(tt)           # Delete existing thumbnail
  227.         }
  228.         xecho " \&t[i]"                 # Create new thumbnail
  229.         !convert \&t[i] -thumbnail x\m(height) \m(tt)
  230.         if fail echo PROBLEM MAKING THUMBNAIL FROM \&t[i] - Continuing...
  231.         chmod 644 \m(tt)
  232.     }
  233.     echo                                # Done with thumbnails
  234. }
  235. .\%t := \ffiles(*-t.jpg)                # Now see how many thumbnails exist
  236.  
  237. # Localization (Spanish or English)...
  238.  
  239. .charset = iso-8859-1                   # Character set is ISO 8859-1
  240. undef langtag                           # No HMTL language tag yet
  241.  
  242. switch \m(language) {                   # Text messages for selected language
  243.   :spanish
  244.     .langtag = { lang="es"}             # HTML language tag
  245.     if not def title .title = Fotos     # Default title
  246.     .photo = Foto                       # Individual page title
  247.     .next  = Adelante                   # Forward
  248.     .prev  = Atrßs                      # Back
  249.     .index = Indice                     # Index
  250.     .up    = Arriba
  251.     .msg1  = Haz clic en cualquier nombre para ver fotos # Legend for index
  252.     if \%t .msg1 = Haz clic en cualquier foto para entrar
  253.     .msg2  = (Haz clic para ver en tama±o completo)
  254.     break
  255.   :english
  256.     .langtag = { lang="en"}             # HTML language tag
  257.     if not def title .title = Photos    # Default title
  258.     .photo = Photo                      # Individual page title
  259.     .next  = Next                       # Forward
  260.     .prev  = Prev                       # Back
  261.     .index = Index                      # Index
  262.     .up    = Up
  263.     .msg1  = Click on any name to see photos # Legend for index
  264.     if \%t .msg1 = Click on any photo to enter
  265.     .msg2  = (Click to enlarge)
  266.     break
  267.   :default
  268.     fatal "No language!"
  269. }
  270. if not def shorttitle .shorttitle := \m(title)
  271.  
  272. if \m(noscale) undef msg2
  273.  
  274. if \m(arrows) {
  275.     undef lp rp
  276.     .index = <span style="font-size:40px;padding-top:16">▲</span>
  277.     .up := \m(index)
  278.     .next = <span style="font-size:36px;padding-top:16">▶</span>
  279.     .prev = <span style="font-size:36px;padding-top:16">◀</span>
  280. }
  281.  
  282. echo Creating Web pages...
  283.  
  284. fopen /write \%o index.html             # Create the index page
  285. if fail fatal FOPEN index failed
  286.  
  287. # Write HTML prologue...
  288.  
  289. fwrite /line \%o <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  290. fwrite /line \%o <html\m(langtag)>
  291. fwrite /line \%o <head>
  292. fwrite /line \%o <title>\m(title)</title>
  293. fwrite /line \%o -
  294.   <META http-equiv="Content-Type" content="text/html; charset=\m(charset)">
  295. do style \%o
  296. fwrite /line \%o </head>
  297. fwrite /line \%o -
  298.  <body style="background:\m(background);color:\m(color);font-size:13pt">
  299. fwrite /line \%o <h1>\m(title)</h1>
  300. fwrite /line \%o {\m(lp) <a href="..">\m(up)</a> \m(rp)  }
  301. fwrite /line \%o <i>(\m(msg1))</i><br>
  302.  
  303. .\%n := \&t[0]                          # How many non-thumbnail JPGs
  304. set flag off
  305. .\%r := \ffiles(*-r.jpg)
  306. if == \%r \%n set flag on               # We have resized images
  307.  
  308. for \%i 1 \%n 1 {                       # Loop through all non-thumbnails
  309.     xecho "FILENAME \&t[\%i] => "       # Start to say what we're going
  310.     .\%b := \fstripx(\&t[\%i])          # Filename without ".jpg"
  311.     .\%f := \%b.html                    # Filename with ".html"
  312.     .\%a := \&t[\%i]                    # Filename of image file
  313.     if flag .\%a := \%b-r.jpg           # Change to this for resized image
  314.     .orientation := \fpictureinfo(\%a)  # Get picture orientation
  315.  
  316.     undef \%q                           # Scaling command for HTML
  317.     switch \m(orientation) {
  318.       :1, .\%p = "Landscape", .\%q := \%w, break
  319.       :2, .\%p = "Portrait",  .\%q := \%h, break
  320.       :default, .\%p = "Unknown"
  321.     }
  322.     if \m(resize) undef \%q             # No HTML scale if resizing ourselves
  323.     echo \%f (\%p)                      # Finish saying what we're doing
  324.     fopen /write \%c \%f                # Create page for this picture
  325.     if fail exit 1 OPEN failed
  326.     fwrite /line \%c -                  # Write HTML prologue
  327.       <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  328.     fwrite /line \%c <html\m(langtag)>
  329.     fwrite /line \%c <head>
  330.     fwrite /line \%c <title>\m(photo) \#\%i - \m(title)</title>
  331.     fwrite /line \%c -
  332.       <META http-equiv="Content-Type" content="text/html; charset=\m(charset)">
  333.     do style \%c
  334.     fwrite /line \%c </head>
  335.     fwrite /line \%c -
  336.       <body style="background:\m(background);color:\m(color);font-size:13pt">
  337.     fwrite /line \%c <h2>\m(title) - \m(photo) \#\%i</h2>
  338.     fwrite /line \%c
  339.     fwrite /line \%c <div>
  340.  
  341.     if == \%i \%n {                     # If last picture there is no next.
  342.         .\%x := index.html
  343.         fwrite /line \%c \m(lp) <a href="index.html">\m(index)</a> \m(rp)
  344.     } else {                            # Not last picture
  345.     .\%x := \fstripx(\&t[\%i+1]).html # So make link to next.
  346.         fwrite /line \%c \m(lp) <a href="\%x">\m(next)</a> \m(rp)
  347.     }
  348.     .xnext := \%x            # Remember this for later
  349.     if != \%i 1 {                       # Not first picture?
  350.       .\%x := \fstripx(\&t[\%i-1]).html # Not first so link to previous
  351.       fwrite /line \%c {  \m(lp) <a href='\%x'>\m(prev)</a> \m(rp)  }
  352.     }
  353.     if != \%i \%n {                     # Not last picture?
  354.       # Link to index
  355.       fwrite /line \%c \m(lp) <a href='index.html'>\m(index)</a> \m(rp)
  356.     }
  357.     if def msg2 fwrite /line \%c <small><i>  \m(msg2)</i></small><br>
  358.     .\%x := \%b
  359.     .\%z = \fcontents(\%b)
  360.     if exist \%x.jpg .\%z = \fcontents(\%x)
  361.  
  362.     fwrite /line \%c </div>
  363.  
  364.     if \m(noscale) {
  365.         fwrite /line \%c <a href='\m(xnext)'><img -
  366. title="\m(shorttitle) \m(photo) \#\%i" -
  367. alt="\m(shorttitle) \m(photo) \#\%i" -
  368. src="\%a"\%q></a>
  369.     } else {
  370.         fwrite /line \%c <a href='\%z.jpg'><img -
  371. title="\m(shorttitle) \m(photo) \#\%i" -
  372. alt="\m(shorttitle) \m(photo) \#\%i" -
  373. src="\%a"\%q></a>
  374.     }
  375.     fwrite /line \%c <p>
  376.     fwrite /line \%c <hr color="\m(color)"> # End of page
  377.     fwrite /line \%c </body>
  378.     fwrite /line \%c </html>
  379.     fclose \%c
  380.     if eq \v(system) unix chmod 664 \%f
  381.     .\%x := \fstripx(\%f)-t             # Make entry in index page.
  382.     if exist \%x.jpg {
  383.         fwrite /line \%o {<a href='\%f'><img -
  384. title="\m(shorttitle) \m(photo) \#\%i" -
  385. alt="\m(shorttitle) \m(photo) \#\%i" -
  386. src="\%x.jpg"></a>}
  387.     } else {
  388.         fwrite /line \%o [ <a href='\%f'>\%f</a> ]
  389.     }
  390. }
  391. # Finish and close Index page
  392.  
  393. fwrite /line \%o <hr color="\m(color)"> # End of page
  394. fwrite /line \%o \v(date)
  395. fwrite /line \%o </body>
  396. fwrite /line \%o </html>
  397. fclose \%o
  398. if eq \v(system) unix {
  399.     chmod 664 index.html
  400.     exit
  401. }
  402.