#!/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|.*$||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 (