#!/usr/local/bin/perl
# make diary's index files
# $Id: mkdiary.pl,v 1.30 2002/01/23 14:35:46 yuuji Exp $
sub usage {
print<<_EOU_;
年/月/日 というディレクトリ構成で日記をつける場合の、
「月」に相当するディレクトリのindex.htmlを生成します。
生成するindex.htmlは、たとえば以下のような見出しになります。
12月
1日 - 師走の風景
25日 - 今日はクリスマス
それぞれのタイトルは、12/01/index.html, 12/25/index.html の中に最初に
現れるH1タグの中身となります。
起動方法: mkdiary.pl 「月」ディレクトリ…
以下のオプションが使用できます。
-bg index.htmlの背景色
-f フッタファイル body末尾に挿入するファイル
-c confファイル 動作設定ファイル(~/.${myname}rc)
-date 西暦年/月/日 その日のテンプレートHTMLを吐き出す
-s Stream(メイルで自動登録)モード
詳しくは http://www.gentei.org/~yuuji/diary/mkdiary/manual.html みてちょ。
_EOU_
exit 0;
}
##
# Global variables
##
$mydir=''; $myname=''; $wday=''; $date=''; $youbi='';
($mydir, $myname) = ($0 =~ m,(.*)/(.*),);
$mybase = ($myname =~ m,([^.]*)(\.pl)?,)[0];
{
local($cwd) = (`pwd`);
chop $cwd;
chdir $mydir;
chop($mydir=`pwd`);
chdir $cwd;
}
# ↓これらの変数の値を変えるときは ~/.mkdiraryrc に書いておく。
# たとえば、背景色を白にしたいときは bg=white のように書く。
%opt =
(
'bg', "lightseagreen", # 背景色
'fg', "", # 前景(文字)色
'tojis', "/usr/local/bin/nkf", # 任意→jis
'toeuc', "/usr/local/bin/nkf -e", # 任意→euc
'euctojis', "/usr/local/bin/nkf -Ej", # euc→jis
'outcode', "jis", # 生成ファイルコード(eucかjis)
'decode64', "/usr/local/bin/mewdecode", # base64デコードプログラム
'titleleft', "【", # 表題の左側につける 【 とか
'titleright', "】", # 表題の右側につける 】 とか
'm', "見出し", # デフォルトの見出し
'header', "$mydir/header", # htmlの先頭につけるやつ
'footer', "$mydir/footer", # htmlの末尾につけるやつ
'day_ascend', 1, # 日付を昇順にソート
'need_wday', 1, # 曜日表示を付ける
'body_opt', "", # bodyに付ける他のオプション
'word_DIARY', "Diary", # タイトルに使うDiaryという単語
'yearformat', "%d年の日記", # 年INDEXのタイトル書式
'css_yearly', "", # 年INDEXcssファイル(必要なら)
'yearleading',"", # 年INDEXのタイトル直後の文句
'monthheading',1, # 「X月」標示をする
'conf', "$ENV{HOME}/.${mybase}rc",
'debugfile', "$mydir/debug", # debugメッセージファイル
'mail', "/usr/bin/mail", # mailコマンドのパス
'notify', 0, # mail更新通知するかどうか
'ownotify', 1, # mail更新時の上書き通知
'gnutar', "gtar", # GNU tar コマンド
'unzip', "unzip", # zipファイル展開用コマンド
'lha', "lha", # lzhファイル展開用コマンド
'bodyfilter', "", # 本文を食わすフィルタコマンド
'bmp2jpg', 0, # BMPをJPEGにするか
'bmp2png', 0, # BMPをPNGにするか
'convert', "convert", # convertコマンド
# 'bodyfilter', "./body2html.rb",
);
%readonlyopts=();
sub setoptreadonly {
for (@_) {
$readonlyopts{$_} = 1;
}
}
sub isoptreadonly {
return $readonlyopts{$_[0]};
}
&setoptreadonly('allow', 'owner');
(eval 'require "timelocal.pl"', $@ eq '')
|| (eval 'use "timelocal"', $@ eq '')
|| die "Cannot find timelocal library.\n";
sub day_week {
local($y, $m, $d) = @_;
$_ = &timelocal(0, 0, 0, $d, $m-1, $y-1900);
"(" . ("日", "月", "火", "水", "木", "金", "土")[(localtime($_))[6]]
. ")";
}
sub setdatevars {
local($y, $m, $d) = ($date =~ m,(\d\d\d\d+)/([01]?\d)/([0-3]?\d),);
$_ = &timelocal(0, 0, 0, $d, $m-1, $y-1900);
$wday = (localtime($_))[6];
$youbi = ("日", "月", "火", "水", "木", "金", "土")[$wday];
$wday = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat")[$wday];
}
sub daytitle {
# 引数ディレクトリのタイトルを返す
local($dir) = @_;
local($index, @title) = ("$dir/index.html", ());
local($bs) = (-s $index);
open(DAYINDEX, $index)
|| return undef; # die "$index がないみたいっす";
select((select(DAYINDEX), $/="")[$[]);
$_='';
read(DAYINDEX, $_, $bs);
close(DAYINDEX);
s/\n//g; # 一気に読んで改行を削る
@title = split(/
/i, $_); # で分離
@title = grep(/H1/i, split(//i, $_));
grep(s|[Hh]1>.*$||g, @title); #
以降切り落とす
grep(s/^\s+//, @title); # 行頭行末スペース切除
grep(s/\s+$//, @title);
grep(s/^/$opt{"titleleft"}/, @title);
grep(s/$/$opt{"titleright"}/, @title);
# print "titles=", join(", ", @title), "\n";
join(", ", @title);
}
sub monthlist {
local($monthdir) = @_;
opendir(MONTH, $monthdir);
local(@months) = readdir(MONTH);
closedir(MONTH);
@months = grep(-d "$monthdir/$_", grep(/\d\d?/, @months));
local($d, %list);
%list = ();
for $d (@months) {
# push(@list, &daytitle("$monthdir/$d"));
$list{$d} = &daytitle("$monthdir/$d")
if (-s "$monthdir/$d/index.html");
# print "list{$d} =", &daytitle("$monthdir/$d"), "\n";
}
%list;
}
sub mkmonthindex {
1;
}
sub mydirname {
local($dir, $d) = @_;
local($myino) = (stat($dir))[1];
die "ルートディレクトリでやるこたないっしょ\n"
if ($myino == (stat("$dir/.."))[1]);
opendir(PARENT, "$dir/..")
|| die "親ディレクトリの読み取り権限下さい";
local(@p) = readdir(PARENT);
closedir(PARENT);
for $d (@p) {
next if (! -d "$dir/../$d");
if ((stat("$dir/../$d"))[1] == $myino) {
print "hogehoge\n" if $debug;
}
print "ここは $d\n" if $debug;
return $d if ((stat("$dir/../$d"))[1] == $myino);
$d = ''; # for success flag
}
die "カレントディレクトリ名がどうも読めないん酢...";
}
sub mkyearindex {
local($yeardir) = @_;
die "$yeardir って無いんですけど…\n" unless (-d $yeardir);
local($y, $m, $day, %title, @dir) = (&mydirname($yeardir));
local($text) = ($opt{'fg'} || "black");
die "$yeardir じゃなくて西暦年のディレクトリを指定してね\n"
unless ($y =~ /\d\d\d\d+/);
# まずヘッダ
open(INDEX, "| $outfilter > $yeardir/index.html")
|| die "$yeardir/index.html に書けないよ。なじぇ?\n";
select INDEX;
printf "
$opt{'word_DIARY'} of $y
$opt{'yearstyle'}%s
", $opt{'css_yearly'}
? ""
: "";
printf "$opt{'yearformat'}
\n", $y;
print "$opt{'yearleading'}\n" if $opt{'yearleading'};
print "\n";
opendir(DIR, $yeardir) || die "$yeardir が読めるようにして下さいな\n";
@dir = readdir(DIR);
closedir(DIR);
@dir = grep(/^\d+$/, @dir);
for $m (sort {$b <=> $a} @dir) { # これは新しい順
next unless ($m =~ /\d\d?/);
printf "
\n - %d月\n", $m if $opt{'monthheading'};
%title = &monthlist("$yeardir/$m");
for $day ($opt{'day_ascend'} ? sort {$a <=> $b} keys(%title) : sort {$b <=> $a} keys(%title)) { # これはオプション day_ascend に従う
printf("
- %s${day}%s%s - %s\n",
$opt{'monthheading'} ? "" : "$m/",
$opt{'monthheading'} ? "日" : "",
$opt{'need_wday'} ? &day_week($y, $m, $day) : "",
$title{$day});
}
}
print "
\n";
if (-f $opt{"footer"}) {
open(FOOTER, "$opt{footer}");
print while (