LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 625|回复: 0

脚本, 生成Web浏览的gallery

[复制链接]
发表于 2007-3-3 13:13:54 | 显示全部楼层 |阅读模式
用到了一点点Javascript, 没有怎么测试.


  1. #!/bin/bash
  2. #
  3. # generate a gallery for web usage.
  4. # useage: title dir
  5. #
  6. # by pointer@tom.com
  7. # date: 2007-03-03 13:04:43


  8. TITLE=${1:-View}
  9. DIR=${2:-./}

  10. parse_dir()
  11. {
  12.     local dir=$1 fn images  subdirs title aimgs aaimgs
  13.     images=''
  14.     subdirs=' '
  15.     title=''
  16.     local oldp=`pwd`
  17.     cd "$dir" || return 3;
  18.     pwd
  19.     for fn in * ;
  20.     do
  21.         if  [ -d "$fn" ] ; then
  22.             echo "[dir $fn ..."
  23.             parse_dir "$fn"
  24.             echo "end $fn]"
  25.             subdirs="$subdirs <a href='$fn/index.html'>$fn</a>"
  26.         else
  27.             file -b -i "$fn" | grep "image/" > /dev/null  &&  {
  28.                 if [ "$images" ] ; then
  29.                     images="$images,"$fn""
  30.                 else
  31.                     mkdir -p ".cache"
  32.                     images=""$fn""
  33.                 fi
  34.                 if [ ".cache/$fn" -ot "$fn" ] ; then
  35.                     convert -resize 90x90 "$fn" ".cache/$fn"
  36.                 fi
  37.             }
  38.         fi
  39.     done
  40.    
  41.     title=`basename $dir`
  42.     title=${2:-$title}
  43.     set_index "$subdirs" "$title" "$images"
  44.     cd $oldp
  45. }

  46. set_index()
  47. {
  48.     local IMAGES SUBDIRS TITLE
  49.     IMAGES=${3:-null}
  50.     SUBDIRS=${1:- }
  51.     TITLE=$2
  52. cat > index.html <<EOF_INDEX_TPL
  53. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  54. <html>
  55. <head>
  56. <meta http-equiv="Content-Type" content="text/html; charset=utf8">
  57. <title>$TITLE</title>
  58. </head>
  59. <body>
  60. <style>
  61. .simgc{width:100px;height:100px;float:left;}
  62. .aimg, .simg{max-width:90px;max-height:90px;margin:5px;}
  63. </style>
  64.    <a href="../index.html" style="float:right;">Up</a>
  65. <h1>$TITLE</h1>
  66. <div id="vd"></div>

  67. <script>

  68. var Class = {
  69.   create: function() {
  70.     return function() {
  71.       this.initialize.apply(this, arguments);
  72.     }
  73.   }
  74. }

  75. Object.extend = function(destination, source) {
  76.   for (var property in source) {
  77.     destination[property] = source[property];
  78.   }
  79.   return destination;
  80. }


  81. Function.prototype.bindAsEventListener = function(object) {
  82.   var __method = this;
  83.   return function(event) {
  84.     return __method.call(object, event || window.event);
  85.   }
  86. }

  87. var ImageView=Class.create();
  88. ImageView.prototype={
  89.    options:{base_src:'./',
  90.             pageSize: 50},
  91.    
  92.    initialize:function(obj, options){
  93.       Object.extend(this.options, options||{});
  94.       this.obj=document.getElementById(obj);
  95.       this.showContainer=document.createElement('div');
  96.       document.body.appendChild(this.showContainer);
  97.       this.showContainer.style.display='none';
  98.       this.showContainer.style.zIndex="10000";
  99.       this.showContainer.style.position="absolute";
  100.       this.showContainer.style.background="green";
  101.       this.showContainer.style.overflow="auto";
  102.       this.showContainer.style.margin="0px";
  103.    },
  104.    
  105.    viewImage:function(imgsrc){
  106.       var s='';
  107.       s+='<div class="simgc">'
  108.          +'<img src="'+this.options.base_src+".cache/"+imgsrc+'" class="simg" />'
  109.          +'</div>';
  110.       return s;
  111.    },

  112.    viewImages:function(imgs){
  113.       var s='';
  114.       for(var i=0;i<imgs.length;++i){
  115.           s+=this.viewImage(imgs[i]);
  116.       }
  117.       return s;
  118.    },

  119.    slideTo:function(ith){
  120.       if(ith<0 || ith>=this.images.length)
  121.          return ;
  122.       this.cur_slide=ith;
  123.       this.cur_images=this.images.slice(ith, ith+this.options.pageSize);
  124.    },

  125.    slideLink:function(){
  126.       var pith=-1, nith=-1, pl, nl;
  127.       nith=this.cur_slide+this.options.pageSize;
  128.       pith=this.cur_slide-this.options.pageSize;
  129.       if(pith<0) {
  130.          if(this.cur_slide==0) pith=-1;
  131.          else pith=0;
  132.       }
  133.       if(nith>=this.images.length){ nith=-1;}
  134.       if(pith>-1) pl=this.setSlideAction(pith);
  135.       if(nith>-1) nl=this.setSlideAction(nith);
  136.       return [pl, nl];
  137.    },

  138.    setSlideAction:function(ith){
  139.       var sp=document.createElement('span');
  140.       sp._pt_ith=ith;
  141.       sp._pt_viewer=this;
  142.       sp.onclick=function(){
  143.          this._pt_viewer.slideTo(sp._pt_ith);
  144.          this._pt_viewer.view();
  145.       };
  146.       return sp;
  147.    },

  148.    view:function(){
  149.       if(!this.cur_images)
  150.          this.slideTo(0);
  151.       var s=this.viewImages(this.cur_images);
  152.       this.obj.innerHTML=s;
  153.       var dpn=document.createElement('div');
  154.       dpn.style.clear="both";
  155.       dpn.style.textAlign="center";
  156.       if(this.cur_slide>0){
  157.          var f=this.setSlideAction(0);
  158.          f.innerHTML="first | "
  159.          dpn.appendChild(f);
  160.       }
  161.       var pnl=this.slideLink();
  162.       if(pnl[0]){
  163.          pnl[0].innerHTML="<<";
  164.          dpn.appendChild(pnl[0]);
  165.       }
  166.       var t=document.createTextNode(" | "+this.cur_slide+" | ");
  167.       dpn.appendChild(t);
  168.       if(pnl[1]){
  169.          pnl[1].innerHTML=">>";
  170.          dpn.appendChild(pnl[1]);
  171.       }
  172.       if(this.cur_slide+this.options.pageSize<this.images.length){
  173.          var e=this.setSlideAction(this.images.length-this.options.pageSize);
  174.          e.innerHTML="  | end";
  175.          dpn.appendChild(e);
  176.       }
  177.       this.obj.appendChild(dpn);
  178.      
  179.       var imgs=this.obj.getElementsByTagName('img');
  180.       for(var i=0;i<imgs.length;++i){
  181.          imgs[i].onclick=this.imgOnclick.bindAsEventListener(imgs[i]);
  182.          imgs[i]._pt_viewer=this;
  183.       }
  184.    },

  185.    imgOnclick:function(e){
  186.       var v=this._pt_viewer;
  187.       v.toggle(this);
  188.    },

  189.    toggle:function(img){
  190.       if(this.curshow){
  191.          if(this.curshow==img){
  192.             if(img.className=='aimg'){
  193.                img.className='simg';
  194.                this.unshow(img);
  195.             }
  196.             else
  197.                alert('toogle, why this happend?');
  198.             this.curshow=null;
  199.             return;
  200.          }
  201.          else {
  202.             this.curshow.className='simg';
  203.          }
  204.       }
  205.       this.curshow=img;
  206.       this.show(img);
  207.       img.className='aimg';
  208.    },

  209.    posShow:function(){
  210.       var x=this.docScrollLeft(), y=this.docScrollTop();
  211.       var m=this.showContainer;
  212.       m.style.left=x+"px";
  213.       m.style.top=y+"px";
  214.       m.style.display="block";
  215.    },

  216.    show:function(img){
  217.       this.showContainer.innerHTML='<img src="'+this.getBigsrc(img.src)+'" alt="'+img.src+'"/>';
  218.       this.showContainer.onclick=img.onclick
  219.       this.posShow();
  220.    },

  221.    getBigsrc:function(imgsrc){
  222.       var idx=imgsrc.lastIndexOf("/.cache/");
  223.       if(idx<0) return imgsrc;
  224.       return imgsrc.slice(0, idx)
  225.             +imgsrc.slice(idx+".cache/".length);
  226.    },

  227.    unshow:function(img){
  228.       this.showContainer.style.display="none";
  229.    },

  230.    // pick form RicoUtil ....
  231.    docScrollLeft: function() {
  232.       if ( window.pageXOffset )
  233.          return window.pageXOffset;
  234.       else if ( document.documentElement && document.documentElement.scrollLeft )
  235.          return document.documentElement.scrollLeft;
  236.       else if ( document.body )
  237.          return document.body.scrollLeft;
  238.       else
  239.          return 0;
  240.    },

  241.    docScrollTop: function() {
  242.       if ( window.pageYOffset )
  243.          return window.pageYOffset;
  244.       else if ( document.documentElement && document.documentElement.scrollTop )
  245.          return document.documentElement.scrollTop;
  246.       else if ( document.body )
  247.          return document.body.scrollTop;
  248.       else
  249.          return 0;
  250.    }
  251. };
  252. var images=[$IMAGES];
  253. var iv=new ImageView('vd');
  254. iv.images=images;
  255. iv.view();
  256. </script>
  257. <hr>
  258. <div>
  259. $SUBDIRS
  260. </div>
  261. </body>
  262. </html>

  263. EOF_INDEX_TPL
  264. }

  265. umask 022
  266. parse_dir $DIR $TITLE
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表