なんかオンラインメモ帳っぽいの。

ひさしぶりにCGIとか作ってみた。
http://konbu.s13.xrea.com/tpage/tpage.cgi
テキストを編集、保存できる。超絶劣化Wikiと言ったらわかりやすいのかもしれません。というか実用CGIとしてあんまり成立してませんけど。実用的にするためのプログラミングってあんましおもしろくないから後回す。一々「保存」を押すのめんどくさいし、Ajaxとかに対応したいよね。とかそういう方向性。
CGIをいじったりしてた頃は、少しでも遅くなるのが耐えられなくてモジュールとかまったく使わなかった。CGIとかHTML::Templateとか使ったら、ああ楽だなあ。

以下ソースとか。
tpage.cgi

#!/usr/bin/perl -w

use strict;
use CGI;
use HTML::Template;

my $cgi = new CGI;

mkdir('data') if(!(-e 'data'));
chdir('data') or die "cannot chdir:$!";

my $mode = $cgi->param('mode');
my $page = $cgi->param('page');
my $txtdata = $cgi->param('txtdata');

print $cgi->header(-charset=>'utf-8');
if(!defined($mode)){
  editpage();
}
elsif($mode eq 'edit'){
  editpage($page);
}
elsif($mode eq 'save'){
  if(!defined($page) || $page eq ''){
    $page = newpage();
  }
  savepage($page, $txtdata);
  editpage($page);
}
elsif($mode eq 'delete'){
  deletepage($page);
  editpage();
}
elsif($mode eq 'new'){
  my $page = newpage();
  editpage($page);
}
else {
  my $template = HTML::Template->new(filename=>'edit.template');
  $template->param(STATUS=>'unknown mode');
  print $template->output;
}

exit 0;

sub escape{
  my ($data) = @_;
  $data =~ s/&/&/g;
  $data =~ s/</&lt;/g;
  $data =~ s/>/&gt;/g;
  $data =~ s/"/&quot;/g;
  return $data;
}
sub unescape{
  my ($data) = @_;
  $data =~ s/&quot;/"/g;
  $data =~ s/&gt;/>/g;
  $data =~ s/&lt;/</g;
  $data =~ s/&amp;/&/g;
  return $data;
}
sub get_index{
  opendir(DIR, '.');
  my @filelist = grep(/[0-9]+\.txt/, readdir(DIR));
  closedir(DIR);
  
  my $index;
  for(@filelist){
    /([0-9]+)\.txt/;
    my $page = $1;
    $index .= "<a href=\"tpage.cgi?mode=edit&page=$page\">$page</a>\n";
  }
  $index .= "<a href=\"tpage.cgi?mode=new\">new page</a>\n";
  return $index;
}
sub savepage{
  my ($page, $txtdata) = @_;
  my $file = $page . '.txt';
  open(PAGE, ">$file");
  print PAGE $txtdata;
  close(PAGE);
}
sub editpage{
  my ($page) = @_;
  my $template = HTML::Template->new(filename=>'edit.template');
  my $txtdata;

  if(defined($page)){
    $page = newpage($page);
    my $file = $page . '.txt';

    open(PAGE, $file);
    while(<PAGE>){
      $txtdata .= escape $_;
    }
    close(PAGE);

    $template->param(PAGE=>$page);
    $template->param(TXTDATA=>$txtdata);
  }
  $template->param(INDEX=>get_index());
  print $template->output;
}
sub newpage{
  my($page) = @_;
  if(!defined($page)){
    my $i;
    for($i=0;-e $i.'.txt';++$i){}
    $page = $i;
  }
  my $file = $page . '.txt';
  open(PAGE, ">>$file");
  close(PAGE);
  return $page;
}
sub deletepage{
  my ($page) = @_;
  return if(!defined($page));
  my $file = $page . '.txt';
  unlink $file;
}

edit.template

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" />
<title>
  edit page
</title>
</head>
<body>
  <p>page: <TMPL_VAR NAME=PAGE></p>
  <form method="POST" action="tpage.cgi">
    <textarea name="txtdata" rows="15" cols="80"><TMPL_VAR NAME=TXTDATA></textarea>
    <input type="hidden" name="mode" value="save">
    <input type="hidden" name="page" value="<TMPL_VAR NAME=PAGE>">
    <input type="submit" name="save" value="保存">
  </form>
  <form method="POST" action="tpage.cgi">
    <input type="hidden" name="mode" value="delete">
    <input type="hidden" name="page" value="<TMPL_VAR NAME=PAGE>">
    <input type="submit" name="delete" value="削除">
  </form>
  <p id="status"><TMPL_VAR NAME=STATUS></p>
  <p><TMPL_VAR NAME=INDEX></p>
</body>
</html>

最初はUTF-8でほげろうとしてたけど、なんか化けたりしてめんどくさかったのでEUC-JPに。

いないはずだけどzipでまとめた。
http://konbu.s13.xrea.com/tpage/tpage.zip

test