plagger のデータをbrowserで表示しまくる

iframe使いまくって、Publish::CSV出力されたデータをひたすら画面に表示。
キーバインドemacs風+vi風

AM05:15ころちょと修正@getnext,getprev
AM05:30ころpythonをやめてperlに移行

パーツは4つで、html*1,js*1,cgi(pl)*2

plaggerread.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>
4/1
</title>
<script src="prototype.js"></script>
<script src="sc/scriptaculous.js"></script>

<script src="plaggerread.js"></script>

</head>
<body onload="pagestart();" onkeyup="readerkeyup(event);">
<span id="floatcontrol">
<span class="handle">DragHere</span>
<input type="button" name="setaid" id="setaid" value="DBSearch"  onclick="dodbsearch();">
<input type="button" name="prev" id="prev" value="(P)rev"  onclick="getprev();">
<input type="button" name="next" id="next" value="(N)ext"  onclick="getnext();">
<span id="info">INFOMATION</span>
<br>
<span id="dbinfo"></span>
<br>
<span id="dblist"></span>
<br>
<span id="enlist"></span>
<br>
<span id="logarea">
<br>
<span id="aaaaaa">
キーバインド:<br>
n,j,f:次を読む<br>
p,k,b:前を読む<br>
</span>
</span>
</span>
</body>
</html>

plaggerinfo.cgi

#!/usr/bin/perl
print "Content-type: text/xml ;charset=utf-8\n\n";
print "<response>";
my $csvdir = '/tmp/plagger';

opendir DH, $csvdir or die "$dir:$!";
$fnum=0;
while (my $file = readdir DH) {
	next if $file =~ /^\.{1,2}$/
	print "<filename>$file</filename>";
	$fnum++;
}
closedir DH;
print "<filenum>$fnum</filenum>";
print "</response>";

plaggerentry.cgi

#!/usr/bin/perl

use CGI;

print "Content-type: text/xml ;charset=utf-8\n\n";
print "<response>";
my $csvdir = '/tmp/plagger';

$q = new CGI();
$fn=$q->param("fn");
open(FILE, "$csvdir/$fn") or die;
@rec = <FILE>;
foreach(@rec){
    print "<entry><![CDATA[$_]]></entry>";
}

close(FILE);

print "</response>";

plaggerread.js

var parentpath=''; //cgiのスクリプトの位置
var MAX_CACHE=5; // いくつ前まで保存するか
var disp=0;
var MAX_PAGE=MAX_CACHE*2+1; // iframeの数
var firsttime=0;
var initmode=0;
var newheight=0;
var menuinit = 0;

var elist=new Array(); // URLのリストをいれるところ
//キー入力関係
function readerkeyup(e)
{
  datA=e.keyCode;
  ch=String.fromCharCode(datA);
  if( ch == 'N' || ch == 'J' || ch == 'F'){
    getnext();
  }else if( ch == 'P' || ch == 'K' || ch == 'B'){
    getprev();
  }else if( ch == 'V' ){
    movebottom();
  }else if( ch == 'U' ){
    moveupper();
  }else if( ch == 'I' ){
    initload();
  }else if( ch == 'D' ){
    // debug
    str="";
    for( i = 0 ; i < MAX_PAGE ; i++){
      str=str+"["+$('aaa'+i).siteid+"]";
    }
    alert(str);
    return;
  }
  return;
}

// メニューを下へ
function movebottom()
{
  $('floatcontrol').style.top=($('aaa'+disp).height-0)+10;
}
// メニューを上へ
function moveupper()
{
  $('floatcontrol').style.top=0;
}
// 次の記事を読む
function getnext()
{
  latestid='';
  for( i = 0 ; i < MAX_PAGE ; i++ ){
    latestid=$('aaa'+((disp+MAX_CACHE+MAX_PAGE+MAX_PAGE-i)%MAX_PAGE)).siteid;
    if( !latestid ){
      // ここのエラー処理適当すぎ。。。
      // undefinedになるべきなのかなぁとおもいつつ。。。
      //alert("ERROR! at getnext");
      //return;
      break;
    }else{
      break;
    }
  }
  $("aaa"+disp).style.display = "none";
  disp=(disp+1) % MAX_PAGE;
  $("aaa"+disp).style.display = "";
  if( $("aaa"+disp).siteid == -1){
    if( confirm( "Back to Search?\nor Click DBSearch later" ) ){
      $("aaa"+disp).style.display="none";
      moveupper();
      return;
    }else{
      $("aaa"+disp).style.display = "none";
      disp=(disp-1+MAX_PAGE) % MAX_PAGE;
      $("aaa"+disp).style.display = "";
      
      return;
    }
  }

  if( latestid!=-1){
    setpage((disp+MAX_CACHE)%MAX_PAGE,latestid+1);
  }
  $("info").innerHTML=$("aaa"+disp).siteid;
  return;
}
// 前の記事を読む
function getprev()
{
  if( $("aaa"+disp).siteid == 0 ){
    alert("no previous article");
    return;
  }
  for( i = 0 ; i < MAX_PAGE ; i++ ){
    lastid=$('aaa'+((disp+MAX_CACHE+MAX_PAGE+MAX_PAGE+i+1)%MAX_PAGE)).siteid;
    if( !lastid ){
      // ここのエラー処理適当すぎ。。。
      // undefinedになるべきなのかなぁとおもいつつ。。。
      //alert("ERROR at getprev: not find siteid");
      //return;
      break;
    }else{
      break;
    }
  }
  $("aaa"+disp).style.display = "none";
  disp=(disp-1+MAX_PAGE) % MAX_PAGE;
  $("aaa"+disp).style.display = "";
  if( lastid>0 ){
    setpage((disp-MAX_CACHE+MAX_PAGE)%MAX_PAGE,lastid-1);
  }else{
    setpage((disp-MAX_CACHE+MAX_PAGE)%MAX_PAGE,-1);
  }
  $("info").innerHTML=$("aaa"+disp).siteid;
  return;
}

function dodbsearch()
{
  var ifr=document.getElementsByTagName("iframe");
  for(i = 0 ; i < ifr.length ; i++ ){
    if( ifr[i].id ){
      if( ifr[i].id.substring(0,3)=="aaa" ){
	ifr[i].parentNode.removeChild(ifr[i]);
      }
    }
  }
  getplaggerinfo();
  moveupper();
}


function pagestart()
{
  // draggableにする
  new Draggable('floatcontrol',{revert:false,handle:'handle'});
  // iframeの大きさをウィンドウにあわせる
  if( document.body.innerHeight ){
    newheight = document.body.innerHeight*0.95;
  }else{
    newheight = document.body.clientHeight*0.95;
  }
}

function initload()
{
  if( !firsttime ){
    $('floatcontrol').style.display="none";
    for( i = 0 ; i < MAX_PAGE ; i++){
      newiframe=document.createElement('iframe');
      newiframe.id="aaa"+i;
      newiframe.width="100%";
      newiframe.height=newheight;
      newiframe.style.postion="absolute";
      newiframe.top="0";

      //勝手にプロパティつくっていいのかな
      //newiframe.frameBorder=0;
      if( i!=MAX_CACHE ){
	newiframe.style.display="none";
      }
      $('floatcontrol').parentNode.insertBefore(newiframe,$('floatcontrol'));
      newiframe.siteid=-1;
    }
    // menuを上にもってくる
    if( !menuinit ){
      floatmenudrag();
      menuinit++;
    }
    $('floatcontrol').style.display="";
  }else{
    $("aaa"+disp).style.display="none";
    $("aaa"+MAX_CACHE).style.display="";
  }
  movebottom();
  disp=MAX_CACHE;
  __k=MAX_CACHE;
  initmode=1;
  initpageload();
}
// 受け取ったURLのリストをもとにバッファをうめる
function initpageload()
{
  for( i = 0 ; i < MAX_CACHE+1 ; i++){
    setpage(MAX_CACHE+i,i);
  }
  $("info").innerHTML=$("aaa"+MAX_CACHE).siteid;
}
// 指定された番号のiframeに,URLなどを書き込む
function setpage(framenum,elistnum)
{
  if( elist.length > elistnum && elistnum >=0){
    $("aaa"+framenum).siteid=elist[elistnum][0];
    $("aaa"+framenum).title=elist[elistnum][1];
    $("aaa"+framenum).src=elist[elistnum][2];
  }else{
    $("aaa"+framenum).siteid=-1;
    $("aaa"+framenum).title="non";
    $("aaa"+framenum).src="";
  }
}
// Publish::CSVでできたファイルの一覧の取得
function getplaggerinfo()
{
  var url = parentpath+'plaggerinfo.cgi';
  var pars="";
  var myAjax = new Ajax.Request( url, {method: 'post', parameters:pars, onComplete: getplaggerinfoResponse} );
  return ;
}
// 一覧を画面に書き込む
function getplaggerinfoResponse(originalRequest)
{
  //alert(originalRequest.responseText);
  //return;

  var response = originalRequest.responseXML.documentElement;
  var filenum  = response.getElementsByTagName('filenum')[0].firstChild.nodeValue;
  $('dbinfo').innerHTML=filenum+"個のファイルがみつかりました";
  var filenames = response.getElementsByTagName('filename');
  var str='';
  for( i = 0 ; i < filenum ; i++ ){
    fn=filenames[i].firstChild.nodeValue;
    str=str+"<B onclick='getentry(\""+fn+"\");'>"+fn+"</B><BR>";
  }
  $("dblist").innerHTML=str;
  return;
}
// fnで指定されたCSVのファイルを
function getentry(fn)
{
  var url = parentpath+'plaggerentry.cgi';
  var pars="fn="+fn;
  var myAjax = new Ajax.Request( url, {method: 'post', parameters:pars, onComplete: getplaggerentryResponse} );
  return ;

}
// エントリのリストを表示しつつ、配列elistにため込む
function getplaggerentryResponse(originalRequest)
{
  //alert(originalRequest.responseText);
  //return;

  var response = originalRequest.responseXML.documentElement;
  var entries = response.getElementsByTagName('entry');
  var str='';
  delete elist;
  
  elist = new Array();
  for( i = 0 ; i < entries.length ; i++ ){
    // TODO: "title","http://"の形式にも対応すること
    en=entries[i].firstChild.nodeValue;
    pos=en.lastIndexOf('",http://');
    entitle="notitle";
    if( pos != -1 ){
      entitle = en.substring(1,pos);
      enurl = en.substring(pos+2,en.length-1);
      str=str+"<a href=\""+enurl+"\">"+entitle+"</a><BR>";
      elist.push( [ elist.length,entitle,enurl ]);
    }else{
      pos=en.lastIndexOf(',http://');
      if( pos != -1 ){
	entitle = en.substring(0,pos);
	enurl = en.substring(pos+1,en.length-1);
	str=str+"<a href=\""+enurl+"\">"+entitle+"</a><BR>";
	elist.push( [ elist.length,entitle,enurl ]);
      }
    }
  }
  $("enlist").innerHTML=str;
  initload();
  return;
}
//メニュー関連、あまりいみなし
function floatmenudrag()
{
  $('floatcontrol').style.zIndex=3;
  $('floatcontrol').style.position='fixed';
  $('floatcontrol').style.top=0;
  $('floatcontrol').style.left=0;
}