chalow-1.0/0000755000076600007660000000000010706135745011063 5ustar ytoytochalow-1.0/add-extent.pl0000755000076600007660000000430707722374011013457 0ustar ytoyto#!/usr/bin/env perl # $Id: add-extent.pl,v 1.3 2003/08/25 11:50:33 yto Exp $ # HTML の img タグに width と height を足す use strict; use File::Copy; # identify 自動設定 my $IDENTIFY = `which identify`; die "NO identify!" unless ($IDENTIFY =~ /identify$/); chomp $IDENTIFY; if (@ARGV == 0) { print << "USAGE"; usage: prog [file]... USAGE ; } else { for my $fname (@ARGV) { # HTML ファイルを一気に読み込む open(IN, $fname) or die; my $all = join('', ); close(IN); # cache ファイル my $cfn = $fname; $cfn =~ s!/[^/]*$!!; # パス $cfn .= "/cache_extent-info"; my %file_info; my $file_info_update_flag = 0; if (open(F, $cfn)) { while() { next if (/^\#/ or /^\s*$/); my @c = split(/\s/); if (@c == 3) { $file_info{$c[0]} = [@c[1..2]]; } } close(F); } # img タグの部分を取りだす。 my @con = split(/()/ims, $all); next if (scalar(@con) == 1); # img タグが無いファイルは何もしない my $num = 0; for (my $i = 0; $i < @con; $i++) { if ($con[$i] =~ /^()/ims) { my $in = $1; # width と height の両方が設定されている場合は何もしない next if ($in =~ /\W((width|height)\W.+?\W){2}/i); # ad hoc # width or height を消す $con[$i] =~ s/\s+(width|height)=[^\s]+//gims; # 画像ファイル名を取り出す die unless ($in =~ /\ssrc="?(\S+?)"?[\s>]/i); my $imgfn = $1; # identify で width と height を取得 next unless (-e $imgfn); my ($w, $h); if (defined $file_info{$imgfn}) { ($w, $h) = @{$file_info{$imgfn}}; } else { ($w, $h) = (`$IDENTIFY $imgfn` =~ /(\d+)x(\d+)/); $file_info{$imgfn} = [$w, $h]; $file_info_update_flag = 1; # print join("----", @{$file_info{$imgfn}}),"\n"; } die if $?; # img タグ内に width と height を追加 $con[$i] =~ s|>$| width="$w" height="$h">|ims; $num++; } # cache ファイルの書き込み if ($file_info_update_flag and open(F, "> $cfn")) { foreach my $f (sort keys %file_info) { print F "$f @{$file_info{$f}}\n"; } close(F); } } next if ($num == 0); # 変更箇所なし # 変更箇所があったら、元のファイルを退避してから、上書きする copy($fname, "$fname.bak") or die; open(OUT, "> $fname") or die; print OUT join("", @con); close(OUT); } } chalow-1.0/chalow0000755000076600007660000012567410706135745012305 0ustar ytoyto#!/usr/bin/perl # $Id: chalow,v 1.1 2007-10-19 22:07:25+09 tatsuoyamashita Exp tatsuoyamashita $ # # chalow - CHAngeLog On the Web - convert ChangeLog to HTML files # # This is free software with ABSOLUTELY NO WARRANTY. # 無償・無保証・著作権放棄 (see http://nais.to/~yto/doc/zb/0002.html) # # chalow ホームページ: http://chalow.org/ use strict; use Getopt::Long; use POSIX qw(strftime ceil); use Time::Local; # for 曜日 use HTML::Template; use ChangeLogReader; my $version = '1.0'; # 現在時刻の獲得 my $what_time_is_it_now = strftime "%Y-%m-%d %H:%M", localtime; my $dcdate = strftime "%Y-%m-%dT%H:%M:%S+09:00", localtime; my ($current_ym) = ($what_time_is_it_now =~ /^(\d+-\d+)/); # 今月 ### ユーザ設定項目 obsolete # 自分の home page URL --- 廃止予定。テンプレートに直接書く方針で my $home_page_url = "http://chalow.org/"; # 自分のホームーページの呼び名 --- 廃止予定。同上 my $home_page_name = "chalow home page"; ### ユーザ設定項目 ## デフォルト設定 (ユーザ設定ファイル名が指定されてないとき) # 日記の名前 my $changelog_name = "ChangeLog"; # 自動文字列置換 my $auto_replace = ' s!(
)!

$1

!g; s!(

)!

$1

!g; '; # CSS ファイル my $css_file; # RSSファイル名 my $rss_filename = "cl.rdf"; # RSSに最近何日分表示するか(0の場合は $opt_topn と同じ) my $rss_topn = 0; # インデックスページ(index.html)で最近何日分を表示するか my $opt_topn = 5; # 日付の後に曜日(Mon, Tue, ...)を表示するか (1:yes or 0:no) my $show_day_of_week = 1; # 月ページで、日付を降順 (新しい日付が上) で表示するか (1:yes or 0:no) my $reverse_order_days = 0; # インデックスページのテンプレート my $index_page_template = << "___INDEX_PAGE_TEMPLATE" <TMPL_VAR name=cl_name> RSS

/

last update:

recent days

___INDEX_PAGE_TEMPLATE ; # 月ページのテンプレート my $month_page_template = << "___MONTH_PAGE_TEMPLATE" <TMPL_VAR name=cl_name> / <TMPL_VAR name=ym> Prev Month / Next Month

last update:

___MONTH_PAGE_TEMPLATE ; # 日ページのテンプレート my $day_page_template = << "___DAY_PAGE_TEMPLATE" <TMPL_VAR name=cl_name> / <TMPL_VAR name=ymd> Prev Day / Next Day

/

last update:

___DAY_PAGE_TEMPLATE ; # アイテムページのテンプレート my $item_page_template = << "___PAGE_TEMPLATE" <TMPL_VAR name=header_text> Prev / Next /

Referrer (Inside):

permlink

___PAGE_TEMPLATE ; # カテゴリページのテンプレート my $cat_page_template = << "TMPL" <TMPL_VAR name=cat_name> / <TMPL_VAR name=cl_name>

-

last update:

TMPL ; # item のテンプレート my $item_template = << "EACHITEM"

Referrer (Inside):
EACHITEM ; # entry (date) のテンプレート my $entry_template = << "DAYENTRY"

Referrer (Inside):
DAYENTRY ; # RSSファイルのテンプレート my $rss_template = << "RDFSTR" <TMPL_VAR name=changelog_name> ja <TMPL_VAR name=itemheader> ]]> RDFSTR ; # 表示するとき引用記号 ('>' or '|') を消すか (1:YES, 0:NO) my $remove_quote_mark = 0; # 日付一覧をカレンダー表示にするか (1:YES, 0:NO) my $calendar_style = 0; # アイテムヘッダーのフォーマットをどうするか # (0:"* HOGE:", 1:"* HOGE", 2:"HOGE:",3:"HOGE") my $item_header_style = 0; # item header で h3 タグを使うか (1:YES, 0:NO) - tDiary との互換性のため my $use_h3_for_item_header = 0; # item header の先頭の記号にアンカーをつけるか (1:YES, 0:NO) my $use_item_anchor = 1; # item header の先頭の記号の指定 # 『日記のセクションの先頭(サブタイトルの行頭)に挿入される、リンク用の # アンカー文字列を指定します。なお「_」を # 指定すると、テーマによっては自動的に画像アンカーがつくようになりま # す。』(tDiary の skel/conf.rhtml より) my $item_header_mark = '*'; # 他の年の同じ日付 (月日) へのリンクを張るか (1:YES, 0:NO) my $same_date_jump = 1; # # 各アイテムに記述者名を表示するか (1:YES, 0:NO) # my $show_author_name = 0; # RSS を出力するか (1:YES, 0:NO) my $output_rss = 1; # 日記の説明 for RSS : 例: "日々のあれこれ。" my $changelog_description = ""; # ChangeLog を公開する URL (絶体 URL を強く推奨) - RSS に必須 #my $clog_url = "http://chalow.net/"; my $clog_url = "./"; # 検索用ファイル (cl.itemlist) を作るか (1:YES, 0:NO) my $output_itemlist = 1; # 見出し一覧 (JavaScript ファイル) で出力する日数 my $latest_titles_num = 10; # 日ごとにページを作るか (0:NO, 1:YES) --- obsolete my $day_page_mode = 0; # 作成するページの単位=最小ページ単位 (0:月, 1:日, 2:アイテム) my $page_mode = 0; # カテゴリページを作るか (0:NO, 1:YES) my $output_cat_pages = 1; # カテゴリページ中のエントリ数の上限 # ($output_cat_pages = 1 のときのみ有効) my $cat_page_entry_max = 10; # カテゴリ別item表示のためのCGIを指定する(カテゴリ名は %%CAT%% で置き換え) # ($output_cat_pages = 0 のときのみ有効) my $cat_page_cgi = "clsearch.cgi?cat=%%CAT%%"; #my $cat_page_cgi = ""; # ファイルの最初に出てくる「」を置き換える文字列 my $replace_once = ""; # UTF8 mode (0:OFF, 1:ON) my $utf8_mode = 0; # Read More mode (0:OFF, 1:ON) my $readmore_mode = 1; # Read More tag my $readmore_tag = "===="; ### chalow 普及のため HTML の一番下にリンクを表示する。できれば消さないで。 my $signature = qq(); ### コマンドライン引数 Getopt::Long::Configure('bundling'); my ($opt_topn_tmp, $outputdir, $quiet_mode, $opt_css_file, $debug_mode, $update_by_size, $conf_file, $stop_date); my $gor = GetOptions('n|top-n=n' => \$opt_topn_tmp, 'o|output-dir=s' => \$outputdir, 'c|configure-file=s' => \$conf_file, 's|stop-date=s' => \$stop_date, 'u|update-by-size' => \$update_by_size, 'C|css=s' => \$opt_css_file, 'q|quiet' => \$quiet_mode, '8|utf8' => \$utf8_mode, 'd|debug' => \$debug_mode); if (@ARGV == 0 or $gor == 0) { print << "USAGE"; usage: chalow [options] [file]... -n, --top-n=NUM write NUM days to "index.html" -o, --output-dir=DIR directory to output -c, --configure-file=FILE configure file -s, --stop-date=DATE date to stop processing -u, --update-by-size overwrite only if sizes are different -C, --css=FILE css file -q, --quiet quiet mode -8, --utf8 utf8 mode -d, --debug debug mode USAGE ; exit; } # ユーザ設定ファイルの読み込み (ファイル名が指定されてたときのみ) if ($conf_file ne "") { open(CONF, $conf_file) or die "Can't open $conf_file : $!\n"; binmode(CONF); my $conf = join('', ); # $conf = Jcode->new($conf)->euc; # del 050412 eval $conf; die qq(error in "$conf_file" (obsolete variable?): $@\n) if ($@); } $outputdir = "." if (not defined $outputdir); # ユーザ設定ファイルよりコマンドライン指定を優先する処理 $opt_topn = $opt_topn_tmp if (defined $opt_topn_tmp); $css_file = $opt_css_file if (defined $opt_css_file); # 処理停止日付: 文字列だったものを数値にする。後で数値として日付の比較 # に使うから。 $stop_date =~ s/-//g; my $latest_item_list; my $category_list; my $clog_url_pref = $clog_url; $clog_url_pref =~ s!/[^/]+html?$!/!; $clog_url_pref .= "/" unless ($clog_url_pref =~ m!/$!); # SPEC: $clog_url $clog_url_pref # http://chalow.net/ -> http://chalow.net/ # http://chalow.net/index.html -> http://chalow.net/ # http://chalow.net -> http://chalow.net/ my %month_page; # 月別のページ my %category_item; # カテゴリ別ページ用 item my %inside_ref; # 日付リンクによるリファラー #my %all_entries; # hash for all ChangeLog entries # {XXXX-XX-XX}{"eh"} - Entry header # {XXXX-XX-XX}{1,2,3,...}{"ho"} - Item header (original text) # {XXXX-XX-XX}{1,2,3,...}{"co"} - Item content (original text) # {XXXX-XX-XX}{1,2,3,...}{"cat"} - Category (array) # {XXXX-XX-XX}{1,2,3,...}{"a"} - Author # {XXXX-XX-XX}{"message-top"} - Pragma item # {XXXX-XX-XX}{"message-bottom"} - Pragma item # {XXXX-XX-XX}{curid} - Item ID manager # {XXXX-XX-XX}{1,2,3,...}{"h"} - アイテムヘッダ # {XXXX-XX-XX}{1,2,3,...}{"c"} - 中味 my $cl = ChangeLogReader->new(stop_date => $stop_date); for my $fname (@ARGV) { print "reading \"$fname\"\n" if (!defined $quiet_mode); $cl->store_changelog_file($fname); } print "done.\nconverting\n" if (!defined $quiet_mode); foreach my $ymd (reverse sort keys %{$cl->{all}}) { parse_entry($ymd, \%{$cl->{all}->{$ymd}}); } print "done.\n" if (!defined $quiet_mode); # 月別一覧を作成しておく my $month_page_list = make_month_page_list($cl->{STAT}->{ym}); # 今月の日付一覧を作成しておく my $current_day_list = make_day_list_str($current_ym); ### 生成(1) write_rss_file() if ($output_rss); # RSS ファイルを作る write_itemlist_file() if ($output_itemlist); # 検索用ファイル(itemlist)を作る write_latest_item_list_file(); # 最近の話題一覧を作る write_category_list_file(); # カテゴリ一覧を作る ### HTML 生成のためのループ foreach my $ymd (sort keys %{$cl->{all}}) { my $e = $cl->{all}->{$ymd}; my @items; foreach my $i (sort {$b <=> $a} keys %{$e}) { next if ($i !~ /^\d/); push @items, make_item_html($e, $ymd, $i); } my ($y, $m, $d) = ($ymd =~ /^(\d{4})-(\d\d)-(\d\d)$/); $month_page{"$y-$m"}{$ymd}{str} = make_entry_html($e, $ymd, \@items); } ### 生成(2) HTML ファイルの出力 write_index_page(); write_month_page(); write_day_page() if ($day_page_mode or $page_mode >= 1); write_item_page() if ($page_mode == 2); write_category_page() if ($output_cat_pages); print "done.\n" if (!defined $quiet_mode); exit; ### エントリをパーズして格納する sub parse_entry { my ($ymd, $ent) = @_; for (my $i = $ent->{curid}; $i >= 1; $i--) { my $c = $ent->{$i}->{co}; $c =~ s/^\s*\n//g if ($use_h3_for_item_header == 1); $ent->{$i}{h} = okikae($ent->{$i}{ho}, $ymd, $i); $ent->{$i}{c} = okikae($c, $ymd, $i); } } ### 文字列の置き換え sub okikae { local ($_) = shift; my ($ymd, $i) = @_; # 何かに使えるかな? escape_string(\$_); # 日付リンク情報の格納 - parse_entry にあったが、escape後に行なっ # た方がよいと思ったのでこちらに移動(5.1.19) while (/\[((\d\d\d\d-\d\d)-\d\d(-\d+)?)\]/g) { $inside_ref{$1}{"$ymd-$i"}++; } s/&/&/go; s/\]>/\]>/go; # s/>/>/go; # > が &.. になると、URL とか引用のマッチ狂う # s/"/"/go; # "; ### "<" は置き換える。 s|<(/?[a-z!]+)|<$1|gio; # s|<(/?[a-z]+)|<$1|gio; # コメント () をのこしたい場合はこれ # カスタマイズのヒント: を残す→ # s|<(/?[a-rt-z]+)|<$1|gi; を残す→ # s|<(/?[ac-z]+)|<$1|gi; (副作用 =
なども残る) ### Read More ### s!^$readmore_tag$(.*)$!
$1
!sm; ### 文字修飾と水平線。Hiki の記法を採用。 s!'''(.+?)'''!$1!gms; s!''(.+?)''!$1!gms; s!==(\S.+?)==!$1!gms; s!^\-{4}!
!gms; ### URL。Hiki の記法を採用。 s!\[\[(.+?)\s*\|\s*(.+?)\]\]!get_link_str($1, $2)!gmse; ### 表。Hiki の記法を採用。 s!(^(\|\|[^\n]+\n)+)!''. (join("", (map {join('
', split(/\|\|/ ,$_))} split(/\n/, $1)))) .'
'!gsme; ### 引用 (quote): ">>" と "<<" で囲む s!^>>\n!
!gm; s!^<<\n!
!gm; ### 引用 (quote): "| ..." か "> ..." if ($remove_quote_mark == 1) { my $a; s!((^((\||>)[^\n]*)\n)+)!'
'.($a = $1, $a =~ s{^(\||>)\s?}{}gm, $a).'
'!gme; } else { s!((^((\||>)[^\n]*)\n)+)!
$1
!gmx; } ### 日付で参照リンク # date ref : [YYYY-MM-DD] $_ = datestr2anchor($_); ### URL表記を href で # URL : http://.... # 正規表現は http://www.din.or.jp/~ohzaki/perl.htm#httpURL より。 # バックスラッシュを用いたURL中での改行に対応 021025 #my $URLCHARS = "[-_.!~*'()a-zA-Z0-9;/?:@&=+,%\#\$]"; my $URLCHARS = "[-_.!~*'a-zA-Z0-9;/?:@&=+,%\#\$]"; my $URLDELIM = "\\\\\\n *"; s{(?'. join('', split(/\\/, $1)).''}gem; #")}; ### 行頭のスペースは   に置き換える。 s!^( +)!{" " x length($1)}!gme; s!^()( +)!{"$1" . (" " x length($2))}!gme; ### 自動文字列置換適用 eval $auto_replace; # 各行の行末に
を付ける # memo: 昔は pre で囲んでいたが、v0.23 からやめた #print "1[$_]\n"; s!$!
!gsm; s!
$!!; #print "2[$_]\n"; unescape_string(\$_); # プラグイン呼び出しも行なう s!
!!g; # ad hoc return $_; } ### アイテムをHTMLに変換 sub make_item_html { my ($e, $ymd, $i) = @_; ### item header my $ih = make_item_header_html($e->{$i}{h}, $ymd."-".$i); ### カテゴリ my $catstr = make_cat_link_html($e->{$i}{cat}); ### 日付リンクによるリファラー my @inside_refs = get_inside_ref("$ymd-$i"); ### item の基礎情報 my $item_url = datestr2url("$ymd-$i"); my $item_ymdi = $ymd."-".$i; (my $item_id = $ymd.$i) =~ s/-//g; # Ex. "200309241" ### item の組み上げ my $t = HTML::Template->new(scalarref => \$item_template, die_on_bad_params => 0); my $ccc = $e->{$i}{c}; if ($page_mode == 2 and $readmore_mode) { if ($ccc =~ s!(
.*
)$!!sm) { my $readmore_str = $1; $t->param(readmore => $readmore_str); } } $t->param(content => $ccc); $t->param(header => $ih); $t->param(cat => $catstr); $t->param(author => $e->{$i}{a}); $t->param(referrer => join(" ", @inside_refs)); $t->param(id => $item_id); $t->param(ymdi => $item_ymdi); $t->param(url => $item_url); $t->param(rss_file => $rss_filename); # 050821 my $this_item = $t->output(); if ($output_cat_pages == 1) { # カテゴリ別ページを出すときの処理 my $ent_h = make_entry_header_html($e->{eh}, $ymd); foreach (@{$e->{$i}{cat}}) { # カテゴリ別ページは --stop-date と相性が悪いので注意 push @{$category_item{$_}}, {eh=>$ent_h, cont=>$this_item}; } } return $this_item; } ### エントリをHTMLに変換 sub make_entry_html { my ($e, $ymd, $itemsp) = @_; ### entry header my $ent_h = make_entry_header_html($e->{eh}, $ymd); my ($y, $m, $d) = ($ymd =~ /^(\d{4})-(\d\d)-(\d\d)$/); ### 他の年の同じ日付 (月日) へのリンクを張る my @same_dates; if ($same_date_jump == 1) { if (defined $cl->{STAT}->{md}{"$m-$d"}) { my @ys = sort keys %{$cl->{STAT}->{md}{"$m-$d"}}; @same_dates = map {"$_"} grep {$_ != $y} @ys; } } ### 日付リンクによるリファラー my @inside_refs = get_inside_ref("$ymd"); ### entry の基礎情報 my $entry_url = datestr2url($ymd); my $entry_ymd = $ymd; # my $entry_id = $ymd; $entry_id =~ s/-//g; # Ex. "20030924" (my $entry_id = $ymd) =~ s/-//g; # Ex. "20030924" ### エントリの組み上げ my $t = HTML::Template->new(scalarref => \$entry_template, die_on_bad_params => 0); $t->param(header => $ent_h); $t->param(message_top => $e->{"message-top"}); $t->param(message_bottom => $e->{"message-bottom"}); $t->param(referrer => join(" ", @inside_refs)); $t->param(same_date => join(" ", @same_dates)); $t->param(id => $entry_id); $t->param(ymd => $entry_ymd); $t->param(url => $entry_url); $t->param(rss_file => $rss_filename); # 050821 $t->param(content => @{[join('', @{$itemsp})]}); return $t->output(); } ### カテゴリ別ページ(ex: cat_life.html)を作る。 sub write_category_page { my @cat_list = keys %category_item; foreach my $catname (@cat_list) { my @ents = sort {$b->{eh} cmp $a->{eh}} @{$category_item{$catname}}; my $n = $cat_page_entry_max; my $num_of_old_pages = int(@ents / $n); my @fnames; for (my $i = 0; $i <= $num_of_old_pages; $i++) { $fnames[$i] = get_category_filename($catname); my $suffix = ($i == 0) ? "" : "-".($i+1); $fnames[$i] =~ s/\.html$/$suffix.html/; } for (my $i = 0; $i <= $num_of_old_pages; $i++) { ### ページの組み上げ my $t = HTML::Template->new(scalarref => \$cat_page_template, loop_context_vars => 1, die_on_bad_params => 0); $t->param(cl_name => $changelog_name); $t->param(css_file => $css_file); $t->param(lastupdate => $what_time_is_it_now); $t->param(signature => $signature); $t->param(cat_name => $catname); $t->param(ym => $current_ym); $t->param(day_list => $current_day_list); $t->param(latest_item_list => $latest_item_list); $t->param(category_list => $category_list); $t->param(rss_file => $rss_filename); # 050821 $t->param(entries => [grep /^.+$/, @ents[$i*$n...($i+1)*$n-1]]); my @page_list; my $back_page_url; my $next_page_url; if ($num_of_old_pages > 0) { for (my $j = 0; $j <= $num_of_old_pages; $j++) { $page_list[$j] = ($i == $j) ? $j+1 : qq(@{[$j+1]}); $back_page_url = $fnames[$j] if ($j == $i - 1); $next_page_url = $fnames[$j] if ($j == $i + 1); } } $t->param(page_list => join(" ",@page_list)); $t->param(first_page => $fnames[0]); $t->param(back => $back_page_url); $t->param(next => $next_page_url); $t->param(page_id => $i + 1); $t->param(page_num => $num_of_old_pages + 1); my $ostr = $t->output(); ### ファイルに出力 output_to_file("$outputdir/".$fnames[$i], \$ostr); } } } ### アイテムページ(ex: 2001-01-01-1.html)を作る。 sub write_item_page { my @day_list = reverse sort keys %{$cl->{all}}; for (my $idx = 0; $idx < @day_list; $idx++) { my ($ymd, $ym) = ($day_list[$idx] =~ /^((\d+-\d+)-\d+)/); my $ent = $cl->{all}->{$ymd}; for (my $i = $ent->{curid}; $i >= 1; $i--) { my $item = $ent->{$i}; my $ymdi = "$ymd-$i"; ### カテゴリ my $catstr = make_cat_link_html($ent->{$i}{cat}); ### 日付リンクによるリファラー my @inside_refs = get_inside_ref("$ymdi"); ### item の基礎情報 my $item_url = datestr2url("$ymdi"); my $item_ymdi = $ymdi; my $item_id = $ymdi; $item_id =~ s/-//g; # Ex. "200309241" # 前後のページ my $ymdi_before; my $ymdi_after; if ($i > 1) { $ymdi_before = $ymd."-".($i-1); } elsif ($idx < @day_list - 1) { my $day_b = $day_list[$idx + 1]; $ymdi_before = $day_b."-".$cl->{all}->{$day_b}{curid}; } if ($i != $ent->{curid}) { $ymdi_after = $ymd."-".($i+1); } elsif ($idx > 0) { my $day_a = $day_list[$idx - 1]; $ymdi_after = $day_a."-1"; } ### ページの組み上げ my $t = HTML::Template->new(scalarref => \$item_page_template, loop_context_vars => 1, die_on_bad_params => 0); $t->param(cl_name => $changelog_name); $t->param(css_file => $css_file); $t->param(lastupdate => $what_time_is_it_now); $t->param(signature => $signature); $t->param(ymd => $ymd); $t->param(ym => $ym); $t->param(month_page_list => $month_page_list); $t->param(latest_item_list => $latest_item_list); $t->param(category_list => $category_list); $t->param(back => $ymdi_before); $t->param(next => $ymdi_after); my $ccc = $item->{c}; $ccc =~ s!^
!!g;# ad hoc $t->param(content => $ccc); $t->param(header_text => $item->{ho}); $t->param(header => $item->{h}); $t->param(cat => $catstr); $t->param(author => $item->{a}); $t->param(referrer => join(" ", @inside_refs)); $t->param(id => $item_id); # 200101011 $t->param(ymdi => $item_ymdi); # 2001-01-01-1 $t->param(url => $item_url); # 2001-01-01-1.html $t->param(rss_file => $rss_filename); # 050821 my $ostr = $t->output(); ### ファイルに出力 output_to_file("$outputdir/$ymdi.html", \$ostr); } } } ### 日ページ(ex: 2001-01-01.html)を作る。 sub write_day_page { return if ($day_page_template eq ""); # tmplが空なら作らない仕様(5.1.19) my @day_list = reverse sort keys %{$cl->{all}}; for (my $idx = 0; $idx < @day_list; $idx++) { my ($ymd, $ym) = ($day_list[$idx] =~ /^((\d+-\d+)-\d+)/); # 前後の日ページ my $day_before = $day_list[$idx + 1] if ($idx < @day_list - 1); my $day_after = $day_list[$idx - 1] if ($idx > 0); # 日へのリンク (日付一覧) my $day_list = make_day_list_str($ym); ### ページの組み上げ my $t = HTML::Template->new(scalarref => \$day_page_template, loop_context_vars => 1, die_on_bad_params => 0); $t->param(cl_name => $changelog_name); $t->param(css_file => $css_file); $t->param(lastupdate => $what_time_is_it_now); $t->param(signature => $signature); $t->param(ymd => $ymd); $t->param(ym => $ym); $t->param(day_list => $day_list); $t->param(month_page_list => $month_page_list); $t->param(latest_item_list => $latest_item_list); $t->param(category_list => $category_list); $t->param(rss_file => $rss_filename); # 050821 $t->param(back => $day_before); $t->param(next => $day_after); $t->param(content => $month_page{$ym}{$ymd}{str}); my $ostr = $t->output(); ### ファイルに出力 output_to_file("$outputdir/$ymd.html", \$ostr); } } ### 月ページ(ex: 2001-01.html)を作る。 sub write_month_page { return if ($month_page_template eq ""); # tmplが空なら作らない仕様(5.1.19) my @month_list = reverse sort keys %month_page; for (my $idx = 0; $idx < @month_list; $idx++) { my $ym = $month_list[$idx]; # 前後の月 my $m_before = $month_list[$idx + 1] if ($idx < @month_list - 1); my $m_after = $month_list[$idx - 1] if ($idx > 0); # 日付リンク一覧 my $day_list = make_day_list_str($ym); ### 日々のエントリ作成 my @cont; if ($reverse_order_days) { # 降順: 日付の新しいのが上 (〜v0.11 と同じ) @cont = reverse sort keys %{$month_page{$ym}}; } else { # 昇順: 日付の古いのが上 @cont = sort keys %{$month_page{$ym}}; } my @contlist = map {{content => $month_page{$ym}{$_}{str}}} @cont; ### ページの組み上げ my $t = HTML::Template->new(scalarref => \$month_page_template, loop_context_vars => 1, die_on_bad_params => 0); $t->param(cl_name => $changelog_name); $t->param(css_file => $css_file); $t->param(lastupdate => $what_time_is_it_now); $t->param(signature => $signature); $t->param(ym => $ym); $t->param(day_list => $day_list); $t->param(month_page_list => $month_page_list); $t->param(latest_item_list => $latest_item_list); $t->param(category_list => $category_list); $t->param(rss_file => $rss_filename); # 050821 $t->param(back => $m_before); $t->param(next => $m_after); $t->param(entries => \@contlist); my $ostr = $t->output(); output_to_file("$outputdir/$ym.html", \$ostr); } } ### インデックスページ(index.html)を作る sub write_index_page { ### 最近の何日かだけインデックスページに載せるための処理 my @recent = (reverse sort keys %{$cl->{all}})[0..$opt_topn]; my @top_n_entries; for (my $i = 0; $i < $opt_topn and $recent[$i]; $i++) { my $ymd = $recent[$i]; my ($ym, $d) = ($ymd =~ /^(\d{4}-\d\d)-(\d\d)$/); # $top_n_str .= $month_page{$ym}{$ymd}{str}; push @top_n_entries, {content => $month_page{$ym}{$ymd}{str}}; } my ($ymd, $ym, $d) = ($recent[0] =~ /^((\d{4}-\d\d)-(\d\d))$/); # 日付リンク一覧 my $day_list = make_day_list_str($ym); ### ページの組み上げ my $t = HTML::Template->new(scalarref => \$index_page_template, loop_context_vars => 1, die_on_bad_params => 0); $t->param(cl_name => $changelog_name); $t->param(css_file => $css_file); $t->param(lastupdate => $what_time_is_it_now); $t->param(signature => $signature); $t->param(ymd => $ymd); # 最新エントリの日付 $t->param(ym => $ym); # 最新エントリの月 $t->param(ndays => $opt_topn); $t->param(day_list => $day_list); $t->param(month_page_list => $month_page_list); $t->param(latest_item_list => $latest_item_list); $t->param(category_list => $category_list); $t->param(rss_file => $rss_filename); # 050821 $t->param(entries => \@top_n_entries); my $ostr = $t->output(); output_to_file("$outputdir/index.html", \$ostr); } ### 月別一覧を作成 sub make_month_page_list { my ($month_page) = @_; my @month_list = sort keys %{$month_page}; my ($start_year) = ($month_list[0] =~ /^(\d\d\d\d)/); my ($end_year) = ($month_list[$#month_list] =~ /^(\d\d\d\d)/); my $month_page_list = ""; for (my $y = $end_year; $y >= $start_year; $y--) { # year loop $month_page_list .= "$y : "; for (my $m = 1; $m <= 12; $m++) { # month loop my $m0 = sprintf "%02d", $m; if (defined $month_page->{"$y-$m0"}) { $month_page_list .= "$m0 "; } else { $month_page_list .= "$m0 "; } } $month_page_list .= "
\n"; } return $month_page_list; } ### 日付リンク一覧を作成 - 文字列を返す sub make_day_list_str { my ($ym) = @_; if ($calendar_style == 1) { return make_calendar_table($ym, make_day_list($ym)); } else { return join(" ", @{make_day_list($ym)}); } } # 日付リンク一覧を作成 - リストへのポインタを返す my %daylist; sub make_day_list { my ($ym) = @_; my $lday = get_last_day_of_month($ym); return $daylist{$ym} if (defined $daylist{$ym}); # cache for (my $d = 1; $d <= $lday; $d++) { my $day = ($d < 10) ? "0".$d : $d; if (defined $cl->{all}->{$ym."-".$day}) { my $day_url = datestr2url($ym."-".$day); push @{$daylist{$ym}}, qq($day); } else { push @{$daylist{$ym}}, $day; } } return $daylist{$ym}; } # 日付一覧を作成 - カレンダースタイル sub make_calendar_table { my ($ym, $dlistp) = @_; my ($y, $m) = split("-", $ym); my $offset = (localtime timelocal(0, 0, 0, 1, $m - 1, $y))[6]; my $week = 0; my @cal; for (my $i = 0; $i < 42; $i++) { my $day = ($i < $offset) ? " " : $dlistp->[$i - $offset]; last if (not $day); $day =~ s/^0//; $day =~ s/>0([1-9])$1$day); $week++ if (($i + 1) % 7 == 0); } my @wn = ("S", "M", "T", "W", "T", "F", "S"); # my @wn = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); my $rv = << "CAL" @{[join "", map {qq()} @wn]} @{[join "", map {"$_"} @cal]}
$ym
$_
CAL ; return $rv; } ### anchor, img タグ文字列を生成。 sub get_link_str { my ($a, $b) = @_; if ($a =~ /\.(jpg|jpeg|png|gif)$/i) { # [[http://nais.to/|image/nais.jpg]] return qq(画像); } elsif ($b =~ /\.(jpg|jpeg|png|gif)$/i) { # [[自画像|image/sp.jpg]] return qq($a); } else { # [[トップページ|http://nais.to/]] return qq($a); } } ### 年月日を入力とし曜日を出力する関数 since 021001 # RETURN VALUES # the text name of the day of the week. Mon, Tue, Wed, ... # EXAMPLES # get_day_of_week(1, 12, 2002), get_day_of_week("2002-12-01") sub get_day_of_week { my ($d, $m, $y) = @_; ($y, $m, $d) = split("-", $d) unless (defined $m); my $WEEKDAY = (localtime timelocal(0, 0, 0, $d, $m - 1, $y))[6]; return ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat")[$WEEKDAY]; } ### 年月を入力としその月の最終日を出力する関数 since 030105 # EXAMPLES # get_last_day_of_month(12, 2002), get_last_day_of_month("2002-12") sub get_last_day_of_month { my ($m, $y) = @_; ($y, $m) = split("-", $m) unless (defined $y); return (31, ((($y % 4 == 0) and ($y % 100)) or ($y % 400 == 0)) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)[$m - 1]; } ### RSS ファイルを出力する sub write_rss_file { my $rdfseq; my $rdfitem; my $ctr = ($rss_topn > 0) ? $rss_topn : (($opt_topn > 7) ? 7 : $opt_topn); my @items; foreach my $ymd (sort {$b cmp $a} keys %{$cl->{all}}) { $ctr--; last if ($ctr < 0); my $e = $cl->{all}->{$ymd}; foreach my $i (sort {$b <=> $a} keys %$e) { next if ($i !~ /^\d/); my $permlink = $clog_url_pref.datestr2url($ymd."-".$i); my ($ym) = ($ymd =~ /^(\d{4}-\d\d)-\d\d/); my $coen = $e->{$i}{c}; $coen =~ s!{$i}{c}; $cont = html2xmlstr($cont); if ($cont =~ s/^(([\x00-\x7F]|[\x80-\xFF]{2}){300}).+$/$1/sm) { $cont =~ s/&[^;]*$//g; # >...$ でXMLパーズエラー $cont .= "..."; } my $item_dcdate = # ($dcdate =~ /^$ymd/) ? $dcdate : $ymd."T23:59:59+09:00"; push @items, { permlink => $permlink, itemheader => html2xmlstr($e->{$i}{h}), itemauthor => $e->{$i}{a}, itemcontent => $cont, itemcontentencoded => $coen, item_dcdate => $item_dcdate }; } } my $t = HTML::Template->new(scalarref => \$rss_template, die_on_bad_params => 0, gloval_vars => 1); $t->param(items => \@items); $t->param(changelog_name => $changelog_name); $t->param(dcdate => $dcdate); $t->param(changelog_description => $changelog_description); $t->param(clog_url => $clog_url); $t->param(clog_url_pref => $clog_url_pref); $t->param(rss_file => $rss_filename); # 050821 $t->param(generatoragent=>"http://chalow.org/?v=$version"); my $ostr = $t->output(); to_utf8_cl(\$ostr) if (not $utf8_mode); output_to_file("$outputdir/$rss_filename", \$ostr); } sub html2xmlstr { local ($_) = @_; s/ / /g; s||[$1]|gosm; s/[\t\n]//g; s/[\x00-\x1f]+/ /g; s/\s\s+/ /g; s|<[^<>]+?>||gosm; s/<//>/go; s/{all}}) { $ctr--; last if ($ctr < 0); my $e = $cl->{all}->{$ymd}; foreach my $i (sort {$b <=> $a} keys %$e) { next if ($i !~ /^\d/); my ($ym) = ($ymd =~ /^(\d{4}-\d\d)-\d\d/); my $c = $e->{$i}{h}; $c =~ s/[\t\n]//g; $c =~ s/\s\s+/ /g; $c =~ s/\s*$//; $c =~ s/<.+?>//g; $c =~ s/^\*\s+//; # $c =~ s/\'/&\#x27;/g; if ($date ne $ymd) { push @lines, "$ymd
"; $date = $ymd; } push @lines, "- $c
"; } } my $ostr = join("\n", map {s/\'/&\#x27;/g; "document.writeln('".$_."');"} @lines); output_to_file("$outputdir/cl.js", \$ostr); $latest_item_list = join("\n", @lines); } sub write_category_list_file { ### カテゴリ一覧 # return if ($output_cat_pages == 0 or $cat_page_cgi eq ""); # return if ($output_cat_pages == 0); my @lines = (); foreach my $cat (sort keys %{$cl->{CAT}}) { my $n = $cl->{CAT}->{$cat}; my $url; if ($output_cat_pages) { $url = get_category_filename($cat); $url = $clog_url_pref.$url; } else { $url = $cat_page_cgi; $url =~ s/%%CAT%%/urlencode($cat)/ge; $url = $clog_url_pref.$url if ($url !~ /^http/); } push @lines, "- $cat ($n)
"; } my $ostr = join("\n", map {s/\'/&\#x27;/g; "document.writeln('".$_."');"} @lines); $category_list = join("\n", @lines); if ($output_cat_pages == 1) { output_to_file("$outputdir/cl-cat.js", \$ostr); } } ### 検索用ファイルを出力する # clsearch.cgi 用のファイルを生成 sub write_itemlist_file { my $ostr; foreach my $ymd (sort {$b cmp $a} keys %{$cl->{all}}) { my $e = $cl->{all}->{$ymd}; foreach my $i (sort {$b <=> $a} keys %$e) { next if ($i !~ /^\d/); my ($ym) = ($ymd =~ /^(\d{4}-\d\d)-\d\d/); my $h = $e->{$i}{h}. ((defined $e->{$i}{"cat"}) ? join('', map {"[$_]"} @{$e->{$i}{"cat"}}) : ""); my $c = $h."\x01".$e->{$i}{c}; $c =~ s||[$1]|gosm; $c =~ s/[\t\n]//g; $c =~ s/ / /g; $c =~ s/\s\s+/ /g; $c =~ s/<.+?>//g; $c =~ s/\x01/\t/; # 超 ad hoc。やば $ostr .= datestr2anchor("[$ymd-$i]")."\t$c\n"; } } if (-e "$outputdir/cl.itemlist" and $stop_date != 0) { # 差分更新 open(F, "$outputdir/cl.itemlist") or die; my $flag = 0; while () { if ($flag == 0) { (/\[(\d+)-(\d+)-(\d+)-/); my $cdate = $1 * 10000 + $2 * 100 + $3; $flag = 1 if ($stop_date > $cdate); } $ostr .= $_ if ($flag); } close F; print "update "; } output_to_file("$outputdir/cl.itemlist", \$ostr); } ### 日付で参照リンク sub datestr2anchor { my ($d) = @_; if ($page_mode == 2) { # アイテムモード $d =~ s!\[(\d{4}-\d\d-\d\d(-\d+)?)\]![$1]!g; } elsif ($day_page_mode or $page_mode == 1) { # 日モード $d =~ s!\[((\d{4}-\d\d-\d\d)(-\d+)?)\]![$1]!g; } else { # 月モード $d =~ s!\[((\d{4}-\d\d)-\d\d(-\d+)?)\]![$1]!g; } return $d; } sub datestr2url { my ($d) = @_; if ($page_mode == 2) { # アイテムモード $d =~ s!(\d{4}-\d\d-\d\d(-\d+)?)!$1.html!; } elsif ($day_page_mode or $page_mode ==1) { # 日モード unless ($d =~ s!((\d{4}-\d\d-\d\d)-\d+)!$2.html\#$1!) { $d =~ s!(\d{4}-\d\d-\d\d)!$1.html!; } } else { # 月モード $d =~ s!((\d{4}-\d\d)-\d\d(-\d+)?)!$2.html#$1!; } return $d; } ### 文字列置き換えから一時的に退避し、後に復帰させる my $num_of_escaped_string; my %escaped_string; my $num_of_escaped_src; my %escaped_src; my $num_of_escaped_plugin; my %escaped_plugin; sub escape_string { my ($strp) = @_; ### HTML エスケープ - 文字列そのまま my $btag = '_HTML_START_\n'; # 開始マーク my $atag = '_HTML_END_\n'; # 終了マーク $num_of_escaped_string = 0; $$strp =~ s!$btag(.*?)$atag! $escaped_string{++$num_of_escaped_string} = $1, sprintf("\x5\x13%d\x3", $num_of_escaped_string)!gsmxe; $$strp =~ s!\[(literal|sic|esc)\](.*?)\[/\1\]! $escaped_string{++$num_of_escaped_string} = $2, sprintf("\x5\x13%d\x3", $num_of_escaped_string)!gsmxe; ### ソースエスケープ - "&" や "<" などを置換し pre を付ける $num_of_escaped_src = 0; $$strp =~ s!\[src\](.*?)\[/src\]! $escaped_src{++$num_of_escaped_src} = $1, $escaped_src{$num_of_escaped_src} =~ s/&/&/g, $escaped_src{$num_of_escaped_src} =~ s//>/g, sprintf("\x6\x13%d\x3", $num_of_escaped_src)!gsmxe; ### プラグインエスケープ $num_of_escaped_plugin = 0; $$strp =~ s!{{(.*?)}}! $escaped_plugin{++$num_of_escaped_plugin} = $1, sprintf("\x7\x13%d\x3", $num_of_escaped_plugin)!gsmxe; } sub unescape_string { my ($strp) = @_; ### プラグインアンエスケープ - 実行! $$strp =~ s|\x7\x13(\d+)\x3|eval($escaped_plugin{$1})|ge; ### ソースアンエスケープ - pre 追加 #$$strp =~ s|\x6\x13(\d+)\x3|
$escaped_src{$1}
|g; $$strp =~ s|\x6\x13(\d+)\x3|

$escaped_src{$1}

|g; ### HTML アンエスケープ $$strp =~ s|\x5\x13(\d+)\x3|$escaped_string{$1}|g; } ### inside referrer のリンク作成 sub get_inside_ref { my ($id) = @_; if (defined $inside_ref{"$id"}) { return map {datestr2anchor("[".$_."]")} (sort {$b cmp $a} keys %{$inside_ref{"$id"}}); } return (); } ### カテゴリページのファイル名を生成 sub get_category_filename { my ($cn) = @_; to_utf8_cl(\$cn) if (not $utf8_mode and $cn =~ /[\x80-\xff]/); $cn =~ s/([^0-9a-z_-])/unpack('H2', $1)/gei; $cn =~ tr/A-Z/a-z/; return "cat_$cn.html"; } ### エントリヘッダーの生成 sub make_entry_header_html { my ($eh, $ymd) = @_; if ($show_day_of_week == 1) { ### 日付の後ろをどうするか? # 曜日(Mon, Tue, ...)を追加: "2000-10-19" --> "2000-10-19 Thu" $eh .= " ".get_day_of_week($ymd); } return qq($eh); } ### アイテムヘッダーの生成 sub make_item_header_html { my ($ih, $ymdi) = @_; # 前に足すもの my $ihb = ""; if ($item_header_style == 0 or $item_header_style == 1) { $ihb = $item_header_mark; if ($use_item_anchor == 1) { my $day_url = datestr2url($ymdi); $ihb = qq($ihb); } $ihb .= " "; } # タグで囲む $ih = qq($ihb$ih); # 後ろに足すもの if ($item_header_style == 0 or $item_header_style == 2) { $ih .= ":"; } return $ih; } ### make category link(anchor) string for item header sub make_cat_link_html { my ($catp) = @_; my $catstr; if (defined $catp) { if ($output_cat_pages) { $catstr = join("", map {"[$_]"} @$catp); } elsif ($cat_page_cgi eq "") { $catstr = join("", map {"[".$_."]"} @$catp); } else { $catstr = join("", map {my $tmp = $cat_page_cgi; $tmp =~ s/%%CAT%%/urlencode($_)/ge; "[$_]"} @$catp); } } return $catstr; } ### 指定されたファイルへ文字列を出力 sub output_to_file { my ($fname, $contp) = @_; $$contp =~ s//$replace_once/; if ($update_by_size == 1 and -s $fname == length($$contp)) { return; } if ($utf8_mode) { # ad hoc 050821 $$contp =~ s/;charset=EUC-JP">/;charset=UTF-8">/; } print "output to \"$fname\"\n" if (!defined $quiet_mode); open(F, "> $fname") || die "$fname: $!\n"; binmode(F); print F $$contp; close(F); } ### URL ENCODE sub urlencode { local ($_) = @_; s/([^ \n\.\*\-_A-Z0-9])/sprintf("%%%02lX",unpack("C",$1))/gie; s/ /+/g; return $_; } ### modularized for i18n # delete content of this func, # if you use utf8 file and don't use Jcode. sub to_utf8_cl { my ($sp) = @_; use Jcode; $$sp = Jcode->new($$sp)->utf8; } chalow-1.0/ChangeLog0000644000076600007660000016356110706133621012640 0ustar ytoyto2007-10-19 YAMASHITA Tatsuo * version 1.0[リリース]: chalow 1.0 を公開します。 長いことほったらかしなのが気がかりだったので、 最低限の修正でとりあえず1.0を出しておくことにします。 ソースも oldtype で人様に見せれるものではないですが、 使えればよいや、ということで。 現在は、1.0とかなりかけ離れた新バージョンを作っています。 というか、いじっていると結構かけ離れてしまった、というのが真相です。 * clsearch.cgi: URLなどを修正。 * conf/utf8/cl.conf: URLなどを修正。 * cl.conf: URLなどを修正。 * README: ちょろっと修正。 * chalow (unescape_string): Tatsuya Kinoshita パッチを適用。 2005-08-21 YAMASHITA Tatsuo * version 1.0rc6[リリース]: 公開。 * chalow: RSSに最近何日分表示するかを指定できるようにした。 0の場合は $opt_topn と同じになる。 [src] # RSSに最近何日分表示するか(0の場合は $opt_topn と同じ) $rss_topn = 0; [/src] (write_rss_file): ←上記のためにこの関数いじった。 * conf/utf8/cl.conf: 御指摘頂いたものを修正しました。ありがとうございました。 ●文字化け修正。 * chalow (output_to_file): 御指摘頂いたものを修正しました。ありがとうございました。 ●utf8 modeのとき、chalowスクリプト内のテンプレートの、charset 指定を デフォルトの EUC-JP ではなく UTF-8 にするようにした。ad hoc。 [src] if ($utf8_mode) { $$contp =~ s/;charset=EUC-JP">/;charset=UTF-8">/; } [/src] * chalow: 御指摘頂いたものを修正しました。ありがとうございました。 ●usageメッセージで、-cオプションのところの「(default "cl.conf")」 は昔の仕様なので削除。 ●blockquoteの前後のpタグの問題。定義のところでデフォルトで以下を 入れておくことにした。 [src] my $auto_replace = ' s!(

)!

$1

!g; s!(

)!

$1

!g; '; [/src] ●RSSのファイル名として、cl.rdf以外も使えるようにしました。 cl.conf で設定できます。デフォルトは "cl.rdf" です。 [src] # RSSファイル名 $rss_filename = "cl.rdf"; [/src] - cl.rdf 以外のファイル名にしたい人が過去の cl.conf を編集して使う 場合の手順: cl.conf に $rss_filename を追加(上記)し変更。 そして、cl.conf 中の各種テンプレートファイル( $index_template, $month_page_template, $day_page_template, $item_page_template, $cat_page_template, $rss_template)中の "cl.rdf" を に置き換えて下さい。 2005-08-10 YAMASHITA Tatsuo * version 1.0rc5[リリース]: 公開。 今回の主な変更点は以下: '''「続きを読む」機能''': '[esc]====[/esc]' と記入するとそれ以下の記述が省略され item page へ ジャンプするリンクが表示されます。 item page を出すようにしたとき($page_mode=2)のみ機能します。 なお、cl.conf の $item_template に以下のような記述を追加する必要が あります。 [src] 続きを読む [/src] '''utf8 mode''': chalow をコマンドラインオプション --utf8 で実行。ChangeLog 本体も cl.conf も文字コードが utf8 になっている必要あり。 cl.conf は conf/utf8/cl.conf を参考にどうぞ。 * README: mod. * ChangeLogReader.pm: 新しいのに置き換えた。(これまでは別ファイル名でテストしてた) * 要望: - カテゴリ一覧をネスト 2005-06-23 YAMASHITA Tatsuo * chalow: > my $readmore_tag = "[esc]====[/esc]"; デフォルトを :::: から [esc]====[/esc] に変更。はてな記法に準拠。 2005-04-12 (Tue) YAMASHITA Tatsuo * chalow (okikae,make_item_html): readmoreの処理を追加。 * 「続きを読む」機能[ReadMore]: 仕様:item page を出すようにしたとき($page_mode=2)のみ機能する。 item pageでは全部読める。 他のページでは指定したところまで表示し、「read more」等のリンク でitem pageへ飛ぶ。 ==== okikaeでreadmore記法の箇所とitemの最後に class 付きタグを入れる。 > んんん > :::: > あああ ↓ > んんん >

あああ
make_item_html() - for other pages (1) name=content には、readmoreのdivを消したものを入れる。 (2) $item_template で新変数 name=readmore が使えるようになる。 make_item_page() - for item pages そのまま。 > # Read More mode (0:OFF, 1:ON) > $readmore_mode = 1; readmore記法('::::')は変更できる。 > # Read More tag > $readmore_tag = "::::"; * conf/utf8/cl.conf: New. 設定ファイル for utf8 * chalow (to_utf8_cl): New. modularized for i18n * utf8 mode[i18n]: 目的:国際化(UTF8)のために文字コード変換まわりを局所化する。 仕様:文字コード変換をせずにそのまま通す。 > # UTF8 mode (0:OFF, 1:ON) > my $utf8_mode = 0; コマンドラインオプション --utf8 ToDo(chalow) ●ソース中のデフォルトテンプレートを日本語なし(ascii)に ●ユーザ設定読み込み後のEUC-JPへの変換をやめる ●write_rss_file: rss出力時のUTF8への変換切替->func ●get_category_filename: カテゴリファイル名作成時のUTF8変換切替->func !!! 〇clsearch.cgi * 作業再開: 作業を再開しました。 2005-01-25 (Tue) YAMASHITA Tatsuo * chalow (write_rss_file): 旧:$ymd."T23:59:59+9:00"; 新:$ymd."T23:59:59+09:00"; 2005-01-19 (Wed) YAMASHITA Tatsuo * chalow: tmplが空なら月ページ、日ページを作らない仕様にした。 * chalow: pmに手をいれ大掛かりな改造。 2004-12-24 YAMASHITA Tatsuo * version 1.0rc4[リリース]: 公開。 * sample/diary.css: シンプル化。画像指定を止めた。 * chalow: > # RSS の description を CDATA で囲むか (1:YES, 0:NO) > my $rss_cdata = 0; を廃止。ref. [2004-11-28-2] リリース前に導入してすぐに廃止したゆえ影響なし。 * chalow (write_rss_file): dc:creator も出せるようにした。 * cl.conf: 調整。 * chalow (okikae): > s/\]>/\]>/go; ad hoc!! 2004-12-23 YAMASHITA Tatsuo * chalow (escape_string): Add. > $escaped_src{$num_of_escaped_src} =~ s/>/>/g, テキスト中に「]]>」があると「 * chalow (write_rss_file): RSSファイルのテンプレート化! HTML::Templateを使うようにした。 新設定項目。 >> # RSSファイルのテンプレート my $rss_template = << "RDFSTR" ... RDFSTR << あと、RSSをちょっと修整。 xmlns:lang=>xml:lang, resource=>rdf:resource, content:encoded * ChangeLogReader.pm (store_changelog): 仕様変更。 旧: } elsif (/^\t?__DATA__.*$/) { 新: } elsif (/^__DATA__\s*$/) { * README: - typo 時下書き→直書き - typo [src]...[/esc] -> [src]...[/src] - サンプル提示のときの「>」はやめて行頭タブに統一した。 など。 2004-12-11 YAMASHITA Tatsuo * conf/yto/diary.css: New. sample/ にあるのとは別。 2004-11-30 YAMASHITA Tatsuo * chalow (write_rss_file): RSS を Bloglines で見てみると、相対URLがおかしくなっている。 2004-11-27-3.html を http://nais.to/2004-11-27-3.html にしちゃってる。 そこで、RSS 中で相対パスを絶対パスにするようにした。 ad hoc ref. http://chalow.net/2004-11-28-1.html 2004-11-29 YAMASHITA Tatsuo * ChangeLogReader.pm (store_changelog): ゴミ("close F;"が残ってた)を消した。 2004-11-28 YAMASHITA Tatsuo * chalow (write_rss_file): RSS の description で CDATA を出すモード作成。 > # RSS の description を CDATA で囲むか (1:YES, 0:NO) > my $rss_cdata = 0; * chalow: 認識している問題: 非公開itemだけの空エントリが %entry_statistics に残っちゃう問題。 2004-11-27 YAMASHITA Tatsuo * chalow: itemページ作成のためのいろいろ作業。 > # 作成するページの単位 (0:月, 1:日, 2:アイテム) > my $page_mode = 0; (datestr2anchor): あわせる。 (datestr2url): あわせる。 (write_item_page): New. $item_page_template も用意した。 itemのテンプレート要素にcatを追加。 今まで > これから > 他には、header_text というものも。head/title タグなどに使う。 * chalow: ChangeLogReader.pm を使うように改造。 * ChangeLogReader.pm (store_entry): Add. 2004-11-12 YAMASHITA Tatsuo * chalow (write_rss_file): [2004-10-25-2]のをちょっと改造。今日のもの以外は T23:59:59+9:00 を足すことにした。 > 2004-10-25T23:59:59+9:00 2004-11-07 YAMASHITA Tatsuo * version 1.0rc3[リリース]: 公開。 2004-10-25 YAMASHITA Tatsuo * chalow (write_rss_file): RSS の各 item の dc:date について。 今まではすべて日付のみであった。 > 2004-10-25 方針を変更。今日のものだけ時間まで入れることにした。 > 2004-10-25T23:00:00+9:00 追加したロジック: > my $item_dcdate = ($dcdate =~ /^$ymd/) ? $dcdate : $ymd; 2004-10-07 (Thu) YAMASHITA Tatsuo * chalow で差分更新を行なう方法: chalow では --stop-date オプションによる差分更新ができるのだが、 カテゴリファイルは差分更新されない。そこでカテゴリ別表示を clsearch.cgi で行なうようにすると良い。手順は以下の通り:cl.conf の $output_cat_pages を 0 にする。必要ならば $cat_page_cgi の clsearch.cgi へのパスを環境にあわせて変更する。 * chalow (parse_entry): ごめんなさい! 複数人利用のときの item ID 付与方針を変更しました。 1,2,3,4 と普通につきます。 今までは、authorがかわるごとに +100 されてました。 1,2,3,101,102,...という風に。 しかし、この前ロジックを大きく変更してから これが動いていないようです。同じ日付エントリがあると、 マージされないで上書きされてたみたいです。 修整するために上記のように仕様を「自然なもの」に変更しました。 変な仕様にしたのが間違いのもとでした。 ごめんなさい、ごめんなさい、ごめんなさい。 $enthashp->{curid} というのを導入して、item ID を entry ごとに 管理するようにしました。最初からこれで行けばよかったんだよなあ。 猛省。 2004-08-18 (Wed) YAMASHITA Tatsuo * chalow (write_itemlist_file): --stop-date 2004-08-01 すると、 cl.itemlist の 2004-07-31-* らへん がおかしくなる。clsearch.cgiでの検索で発見したバグ。 ロジックがおかしかったので修整した。 2004-07-31 (Sat) YAMASHITA Tatsuo * chalow (write_itemlist_file): --stop-date のとき、 cl.itemlist を差分更新するようにした。 * chalow: クリーニング直後のおかしなロジックを直した。 category_count をクリーニングの直後に入れた。 しかし、これは効率的ではない。再考が必要。 * chalow (write_js_file): 分割した。 (write_category_list_file): カテゴリ一覧 (write_latest_item_list_file): 最近の記事 * chalow (write_*_page): latest_item_list, category_list > $t->param(latest_item_list => $latest_item_list); > $t->param(category_list => $category_list); 使い方 (cl.conf): ↓↓↓↓↓ ただし、updateされるたびに全ファイルの更新が必要になる。 * chalow (write_js_file): JSだけでなくHTMLの文字列をグルーバル変数 $latest_item_list, にキープして HTML::Template で使うことにした。 * chalow (urlencode): New. いまさら。 * chalow: 「HTML 生成のためのループ」のところで、 カテゴリ別item表示をCGIにするときの処理を書く。 (write_js_file): ここでも同様の処理を。 * cl.conf: 新設定項目 see ↓ * chalow: 新設定項目。および、整理。 >> # カテゴリページを作るか (0:NO, 1:YES) my $output_cat_pages = 1; # カテゴリページ中のエントリ数の上限 # ($output_cat_pages = 1 のときのみ有効) my $cat_page_entry_max = 10; # カテゴリ別item表示のためのCGIを指定する(カテゴリ名は %%CAT%% で 置き換え) # ($output_cat_pages = 0 のときのみ有効) my $cat_page_cgi = "clsearch.cgi?cat=%%CAT%%"; << * clsearch.cgi: clsearch.cgiで、カテゴリ指定 (cat:Music, cat:日常生活)、日付指定 (date:2004, date:2004-07, date:2004-07-01)、が使えるようにした。 list modeというのを作った。パラメータで mode=2。マッチしたitemの itemリンクとitem headerの一覧を表示する。全部表示する。from指定な どは無効。date:2004-07 と組み合わせて使うとその月のタイトル一覧が 出せる。 また、dateパラメータを指定すると内部で mode=2 になる。 例: clsearch.cgi?date=2004 また、catパラメータを指定すると内部で mode=1 になる。 例: clsearch.cgi?cat=Life * chalow (write_itemlist_file): cl.itemlistのフォーマットを変更!!!!! cl.itemlistにカテゴリ情報も追加。カテゴリ別表示をCGIでもできるよう にするため。 item headerとitem contentの間をスペースからタブにした。CGIであつか いやすいように。 * chalow (okikae): 昔の画像貼り付け記法への対応を止める(ソースから削除)。 [IMG:image/hogehoge.jpg]など。 >> ### 画像張り付け # image : [IMG:image/2000-06-20-08-32-57.m.jpg] s!\[IMG:([^\]\s]+)\]!get_link_str("画像", $1);die!ge; ### リンク付き画像張り付け # サムネイルと拡大画像などに # image : [IMG:image/hello-s.jpg image/hello.jpg] # image : [IMG:image/hello-s.jpg http://example.com/hoge.html] s!\[IMG:([^\]\s]+)\s+([^\]\s]+)\]!get_link_str($1, $2);die!gesm; << 2004-07-26 (Mon) YAMASHITA Tatsuo * version 1.0rc2[リリース]: 公開。 * cl-yto.conf: Add. "conf/yto/cl-yto.conf". ytoの設定ファイルをサンプルとしてつけ とくことにした。いろいろ足して行こうかと。 * cl.conf (clsearch): [2004-05-12-1]にともない update. 2004-07-22 (Thu) YAMASHITA Tatsuo * cl.conf: 細かく変更。 * chalow (write_rss_file): RSSの各アイテムのタイトルのフォーマットを変更。 OLD: $ymd-$i $ih NEW: $ih 2004-06-27 YAMASHITA Tatsuo * cl.conf: タイポ: blukfeeds --> bulkfeeds 2004-06-13 YAMASHITA Tatsuo * chalow (output_to_file): Replace Once 機能。1行追加しただけ。 > $$contp =~ s//$replace_once/; * cl.conf: 新設定項目。 > # ファイルの最初に出てくる「」を置き換える文字列 > $replace_once = ""; 2004-06-04 YAMASHITA Tatsuo * chalow (make_calendar_table): typo. alisgn --> align * README: 「」についての記述を削除。 その他、エスケープやソースの記述法を追記。 * clkeitai.cgi (output_an_item): [2004-05-12-1]の方法に準拠。 以下を塊として認識する。 2004-05-18 YAMASHITA Tatsuo * chalow: $version でバージョン番号管理です。 2004-05-12 (Wed) YAMASHITA Tatsuo * clsearch.cgi: $home_page_url, $home_page_nameを廃止。 今までの表示がシンプルモード。新たにアイテムモードも容易。これは v0.19までのclsearch.cgiの表示方式。 アイテムモードは、以下を塊として認識する。 clseach.cgi?mode=1 でitem mode。0だとsimple mode。 (get_item): New. ファイルから、IDにより指定されたitemを取りだす関数。 2004-05-09 YAMASHITA Tatsuo * version 1.0rc1[リリース]: 公開。 * README: mod. * sample/diary.css: table 関連追加 (.day)。 h3 を追加。 * chalow (okikae): 表。Hiki の記法を採用。 以下のように記述すると、 > ||項目1-1||項目1-2||項目1-3 > ||項目2-1||項目2-2||項目2-3 以下のような表になります。 ||項目1-1||項目1-2||項目1-3 ||項目2-1||項目2-2||項目2-3 2004-04-24 (Sat) YAMASHITA Tatsuo * cl.conf: 調整。 2004-04-14 (Wed) YAMASHITA Tatsuo * sample/dot-pink-16.png: New! * chalow: 廃止:$no_indent > # タブによるインデントをなくすか (1:なくす or 0:そのまま) > my $no_indent = 0; タブインデントが欲しいときは以下のようにしよう! >
* chalow: 今後は kuttukibbs.cgi 1.0rc1 以降のみサポート。 kuttukibbs.cgi v0.4 以前の亡霊を削除。 削除: $entry_url =~ s/\#/%23/; 削除: $item_url =~ s/\#/%23/; New: $item_ymd, $entry_ymd * cl.conf: mod. インデックスページにサイドバー。 コメント周辺。 * sample/diary.css: mod. 2004-04-01 (Thu) YAMASHITA Tatsuo * cl.conf: mod. 2004-02-27 (Fri) YAMASHITA Tatsuo * chalow (write_category_page): カテゴリページ中のエントリが多いときは複数ページにするようにした。 これにともない新設定項目。 > # カテゴリページ中のエントリ数の上限 > my $cat_page_entry_max = 30; * chalow (make_day_list): > if (defined $all_entries{$ym."-".$day}) { ↓↓↓↓↓↓↓↓↓↓ > if (defined $entry_statistics{ymd}{$ym."-".$day}) { 2004-02-26 (Thu) YAMASHITA Tatsuo * cl.conf (amazon_search): New. プラグイン。amazon サーチ結果リンクの作成。 >> [src]{{amazon_search('トトロ')}}[/src] → {{amazon_search('トトロ')}} [src]{{amazon_search('トトロ','books-jp')}}[/src] → {{amazon_search('トトロ','books-jp')}} [src]{{amazon_search('トトロ','dvd-jp')}}[/src] → {{amazon_search('トトロ','dvd-jp')}} << 2004-02-17 (Tue) YAMASHITA Tatsuo * chalow: HTML::Template 化 - item, entry - write_*_page() - 以下、廃止。 cl.conf からも消す。 >> # インデックスページの HTML ヘッダに追加したいもの (favicon.ico など) my $index_page_head_plus = ""; # 月ページの HTML ヘッダに追加したいもの my $month_page_head_plus = ""; # 日ページの HTML ヘッダに追加したいもの my $day_page_head_plus = ""; # ツッコミ機能を使用するか (1:YES, 0:NO) my $use_tukkomi = 0; # ツッコミのテンプレート =
...
の中味。 # TUKKOMI_DATE はそのエントリの日付 (例: 2003-06-25) に変換される my $tukkomi_template = ""; << * cl.conf (amazon): New プラグイン。amazon リンクの作成。これだけありゃいいじゃん的。 [2004-02-16-1] 2004-02-16 YAMASHITA Tatsuo * version 0.24[リリース]: 公開。 * 今後の予定[メモ]: - HTML::Template を採用。 - $*_page_head_plus の廃止 - $use_tukkomi, $tukkomi_template の廃止 - コメントや TB 関連は entry の template に直接書く方針 - $css_file の廃止 * p:TODO: - 日本語コードの選択 - chalowlib? - くっつき BBS との連携まわりをすっきりさせる - ページ単位だけど、リンク元表示 参考: 要調査: JavaScript で #2003... も取れるか? 2004-02-15 YAMASHITA Tatsuo * chalow: 細かい修整作業いろいろ。 - usage 表示の場所いじる - $top_n_ctr 廃止(いらんかった) - New ↓ > my %entry_statistics; > # {ymd} : 日付 (年-月-日) の重複 (for 複数人利用) > # {ym} : 各年月に含まれている日付エントリ数 > # {md} : 同じ月日を持つ年 for same date jump 2004-02-14 YAMASHITA Tatsuo * cl.conf: 新設定項目。 > # 日付一覧をカレンダー表示にするか (1:YES, 0:NO) > $calendar_style = 0; * chalow (write_rss_file): description が長いとき省略するという機能をちょっと直す。 まだ ad hoc だけど、まあいいや。本当は utf8 でやりたい。 (html2xmlstr): New. for RSS output. (write_js_file): 日付にもリンクを付けた。 (make_day_list_str): New. for 日付一覧 (make_day_list): 整理。 (make_calendar_table): New. 日付一覧のカレンダースタイルを作成。 * README: mod. 2004-02-13 YAMASHITA Tatsuo * chalow (parse_entry)[メモ]: item header の後に続けて何も書かずに改行するスタイルのとき、 item header を h3 で囲む設定にすると、 空行が item の header と content の間に入ってしまう問題について。 > * itemheader: > content content content $use_h3_for_item_header = 1 のときは、item content の最初の空行を 削るようにしている。 * chalow (output_to_file): New. 指定されたファイルへ文字列を出力 * chalow: テンプレート化への布石いろいろ。 * chalow (write_rss_file): $permlink を使ってちょっとだけすっきり。 * chalow (parse_entry)[メモ]: 置き換えの方針:ハッシュに格納するときに okikae()。 置き換えた文字列をRSSなどに流用するので。 2004-02-12 YAMASHITA Tatsuo * README: Mod. 2004-02-11 YAMASHITA Tatsuo * chalow (parse_entry): プラグマ pragma の処理。 日付エントリの上と下にメッセージを埋め込めるようにしてみた。 * メッセージ埋め込み、案2: > * message-top: > > 美食家の末は乞食 --- ベンジャミン・フランクリン > > > * message-bottom: > > ♪ Jeith Jarrett / La Scala > * message-top: 美食家の末は乞食 --- ベンジャミン・フランクリン * message-bottom: ♪ Jeith Jarrett / La Scala * メッセージ埋め込み、案1: 廃案。 > * chalow::pragma: > 美食家の末は乞食 --- ベンジャミン・フランクリン > ♪ Jeith Jarrett / La Scala 2004-02-08 YAMASHITA Tatsuo * cl.conf (cat): New. カテゴリページへのリンクを生成するプラグイン。 * chalow: カテゴリ別ページ作成関連作業。cat_life.html のようなの出力。 (get_category_filename): New. (write_category_page): New. (write_js_file): カテゴリ一覧JavaScriptファイルも出力するようにし た。cl-cat.js * ChangeLogの構造[メモ]: >> ChangeLog └entry*   ├entry header (= XXXX-XX-XX)   └item*     ├id (= XXXX-XX-XX-X)     ├item header     │ ├title     │ └category?     ├item content     └item author? << * chalow: HTML::Template 適用に向けていろいろいじる。 (parse_entry): データ格納とHTML作成を行なっていたが、HTML作成部分 を分離する。 * chalow (clean_changelog): クリーニング時に曜日を削ることにした。後で足す。 * cl.conf: ユーザ設定項目の整理。 remove $opt_odir * chalow (make_item_header_html): New. item header では okikae を適用しないように方針を変更。 カテゴリ処理をあとで施すために。 * chalow (make_entry_header_html): New. * chalow (get_inside_ref): New. HTML::Template を採用したらなくなるかも。 inside referrer の重複を無くした。 2004-01-25 YAMASHITA Tatsuo * chalow: デバグモード ($debug_mode) 作った。ref. [2004-01-09-1] 2004-01-23 YAMASHITA Tatsuo * cl.conf (wiki_link): update. 2004-01-16 YAMASHITA Tatsuo * chalow (write_js_file): js ファイルの url に $clog_url_pref を足すようにした。 2004-01-14 (Wed) YAMASHITA Tatsuo * cl.conf,sample/diary.css: サイドメニューは id="links" (CSS だと #links) で、 本体は id="content" (CSS だと #content) で囲む方針にした。 これは MovableType の方式をまねた。 2004-01-13 (Tue) YAMASHITA Tatsuo * cl.conf (shorten_url): New. URL を短く表示するプラグイン。 使い方:以下の様に書くと、 [src] 参考:{{shorten_url('http://example.com/0123456789/0123456789/ 0123456789/0123456789/0123456789/0123456789-a.html',54)}} {{shorten_url('http://example.com/0123456789/0123456789/ 0123456789/0123456789/0123456789/0123456789-b.html')}} [/src] こうなります: >> 参考:{{shorten_url('http://example.com/0123456789/0123456789/ 0123456789/0123456789/0123456789/0123456789-a.html',54)}} {{shorten_url('http://example.com/0123456789/0123456789/ 0123456789/0123456789/0123456789/0123456789-b.html')}} << 2004-01-11 YAMASHITA Tatsuo * version 0.23[リリース]: 作業途中だけどとりあえず公開。 パワーユーザ以外にはおすすめしません。 2004-01-09 (Fri) YAMASHITA Tatsuo * chalow (clean_changelog): 日付単位に分割してリストに入れるのをこの段階で行なうようにした。 削除した秘密の項目を stdout に出力する処理を実装。 この出力を行なうためのモードは後で作る。当面はデフォルト。 2003-12-29 (Mon) YAMASHITA Tatsuo * chalow (okikae): 行頭のスペースは   に置き換えるようにした。 * chalow (escape_string): 文字列のエスケープ。順番。 1. HTML エスケープ - 文字列そのまま 2. ソースエスケープ - "&" や "<" などを置換し pre を付ける (インデ ントが重要なときに) --- あまり使わないかも 3. プラグインエスケープ 戻すときは逆。 * chalow (okikae): タブを最初に消す方針にしたのでバグが出た。修正。 OLD: my $URLDELIM = "\\\\\\n[\\t ]+"; NEW: my $URLDELIM = "\\\\\\n *"; * cl.conf (amazon_link): プラグインと
の関係でごちゃごちゃと。 引数の "..\n..\n.." という文字列には
を再度足す。 * chalow (write_js_file): New write_js_file(). JavaScript feed ファイルを出力する関数 * pre廃止[メモ]: pre 囲みをやめる。各行の行末に
を付けるようにした。 pre 指定は別に行なう。 ソースの表示は [esc][src][/src][/esc] を使う→エンティティ置換&pre。 例: [literal][esc][/literal]
...
[literal][/esc][/literal] [sic][esc][/sic]
	┏━━━┓ 
	┃   ┣━━━━━┓
	┗┳━━┛     ┃
	 ┃        ┃
	 ┗━━━━━━━━┛
	
[sic][/esc][/sic] ↓ [esc]
	┏━━━┓ 
	┃   ┣━━━━━┓
	┗┳━━┛     ┃
	 ┃        ┃
	 ┗━━━━━━━━┛
	
[/esc] [sic][src][/sic] sub test { my ($k) = @_; return qq($o); } [sic][/src][/sic] ↓ [src] sub test { my ($k) = @_; return qq($o); } [/src] 2003-12-28 (Sun) YAMASHITA Tatsuo * chalow: 最初のクリーン時 (clean_changelog) に行頭のタブを全部なくすように した。これにともなって全体を修正。 他フォーマットのプレインテキスト対応への布石。 (例えば、Windows のメモ帳の .LOG のフォーマット) * chalow: $clog_url の「# 末尾の "/" は不要」って条件を無くす。 (write_rss_file): RSS の出力エントリ数の上限を決めた。7 日分以上は 出さない。 (escape_string): 処理回避ブロック[2003-09-05-1]の記法の追加。 「Wiki Way」を参考に。 > [sic][literal]{{g}}[/literal][/sic], [literal][sic]{{g}}[/sic], [esc]{{g}}[/esc][/literal] ↓ > [literal]{{g}}[/literal], [sic]{{g}}[/sic], [esc]{{g}}[/esc] * cl.conf (blukfeeds): Bulkfeeds キーワード検索プラグイン 2003-12-25 YAMASHITA Tatsuo * chalow (write_rss_file): RSS に以下の記述を追加。 >> xmlns:admin="http://webns.net/mvcb/" << 2003-11-07 YAMASHITA Tatsuo * cl.conf (amazon_link): プラグイン。普通のアマゾンアソシエイトリンクの作成。 2003-11-06 (Thu) YAMASHITA Tatsuo * cl.conf (wiki_link): プラグイン。Wiki へのリンクの作成。 usage: [esc]{{wiki_link('WIKINAME')}}[/esc] {{wiki_link('ゲトマネ戦隊アサマシ8')}} * cl.conf (qualmish_amazon_link): プラグイン。後ろめたい amazon アソシエイトリンクの作成 usage [esc]{{qualmish_amazon_link('ASIN', 'ID', 'STR')}}[/esc] {{qualmish_amazon_link('4756102816','ytoshomepage-22', "TEST:Perl書法 image/gazou.png")}} {{qualmish_amazon_link('4756102816','',"TEST:Perl書法")}} ref. 2003-11-04 YAMASHITA Tatsuo * version 0.22[リリース]: 公開。 バグ修正と小さな変更のみ。 2003-11-03 YAMASHITA Tatsuo * chalow (write_rss_file), cl.conf: channel/description の中身を設定できるようにした。 >> # 日記の説明 for RSS : 例: "日々のあれこれ。" my $changelog_description = ""; << * chalow (parse_entry): RSS の itemheader が出ないというしょうもないバグをなおしました。 http://apollo.u-gakugei.ac.jp/~sunaoka/clog/2003-11.html#2003-11-02-9 2003-11-02 YAMASHITA Tatsuo * version 0.21[リリース]: 公開。 バグ修正や小さな変更のみ。機能の追加などはなし。 * chalow: - h4rss をなくす (all_entries のキー)。 2003-11-01 YAMASHITA Tatsuo * chalow (write_rss_file): 全体の dc:date に日付だけじゃなく時間も入れるようにした。 2003-10-30 YAMASHITA Tatsuo * cl.conf: clsearch プラグインを追加。 * chalow (write_index_page): インデックスページのテンプレートで YEARMONTH が使えるようになりま した! * chalow: - $all_month を廃止。 - make_month_page_list は一回だけ呼ぶことにした。 - write_index_page と write_month_page の引数の数へらす。 - 最近の何日かだけインデックスページに載せるための処理を write_index_page へ。 * chalow (clean_changelog): 項目内での段落区切り表す空行をタブ行にするとこの正規表現を変更。 ついでに連続空行を詰める。 OLD $$strp =~ s/\n(\n\t[^\*])/\n\t$1/gm; NEW $$strp =~ s/\n+(\n\t[^\*])/\n\t$1/gm; 2003-10-28 YAMASHITA Tatsuo * clsearch.cgi: 検索結果にリンク出来るようにデフォルトとして GET を指定。 2003-10-27 YAMASHITA Tatsuo * chalow (write_rss_file): > $today → $today http://mailarc.namazu.org/htmlmail/chalow/62 (parse_entry): > push @{$same_date{"$m-$d"}}, $y; # 同じ日付 (月日) を持つ年のリスト → > push @{$same_date{"$m-$d"}}, $y # 同じ日付 (月日) を持つ年のリスト > if (!grep(/$y/, @{$same_date{"$m-$d"}})); http://mailarc.namazu.org/htmlmail/chalow/63 バグフィックス2つ。 2003-10-23 YAMASHITA Tatsuo * chalow (okikae): コメントを残す、というデフォルト設定をやめた。 * chalow (clean_changelog): Saito HiroAki 氏のパッチを適用したのち、若干手直し。 [chalow:60] プライベートアイテムだけのエントリでparse error http://mailarc.namazu.org/htmlmail/chalow/60 2003-10-22 (Thu) YAMASHITA Tatsuo * p:秘密です: [2003-10-23-1]のテスト。 ほほう。 へへへ 2003-10-21 (Tue) YAMASHITA Tatsuo * version 0.20[リリース]: 公開 * 今回の変更点: - 日ページ作成機能 - 変更のあったファイルだけ出力するモード - 複数ファイルのマージ - HTML タグをそのまま書く記法 - 検索 CGI まわりの変更 - 携帯電話用 CGI - TrackBack を使うための改造 * clkeitai.cgi (output_simple_list): アイテムのサイズが大きすぎるとバグるので修正。 * chalow (write_day_page, write_month_page, write_index_page): 出力先ファイルとサイズが異なる場合のみ出力するモードを設けた。 > # 出力先ファイルとサイズが異なる場合のみ出力する (0:NO, 1:YES) > $update_by_size = 1; さらに、新コマンドラインオプション > -u 出力先ファイルとサイズが異なる場合のみ出力する * chalow (write_rss_file): rss の description の中味の文字列長の上限を決めて、切るようにした。 * README: mod. * chalow (okikae): 引用の新記法:">>" と "<<" で囲む。ref はてなダイアリー。 > >> > 引用です。 > << とすると、 >> 引用です。 << となります。 2003-09-29 (Mon) YAMASHITA Tatsuo * chalow (write_rss_file): RSS の description で改行がスペースになってしまっていたのを修正。 2003-09-25 (Thu) YAMASHITA Tatsuo * chalow: TrackBack を使うための改造。 $tukkomi_template の New 置き換え項目 DATE_ID = "20030924"
$template
の div は cl.conf で設定書い てもら方針に変更。 > $items_new .= qq(
$template
); ↓ > $items_new .= $template; 2003-09-17 (Wed) YAMASHITA Tatsuo * clkeitai.cgi: New!!! chalow により HTML 化されたページをケータイで見るための CGI。 検索用ファイル cl.itemlist が必要です。cl.conf の $output_itemlist (検索用ファイルを作るか否か) を 1 にするが必要あります。 アイテム一覧表示。デフォルトです。HTML タグはほとんどなく、プレイ ンテキストに近い表示です。アイテム別表示へのリンクがあります。 アイテム別表示。アンカーあり。改行あり。アイテム一覧から選んでジャ ンプして来ます。 * clsearch.cgi: use binmode(). * chalow (write_rss_file): にアイテムの中味を入れた。 * cl.conf: ちょい修正。 * chalow: use binmode(). 全てのファイル IO に。 2003-09-10 YAMASHITA Tatsuo * {dot-pink.png, dot-gray.png}: New for item header 2003-09-05 (Fri) YAMASHITA Tatsuo * clsearch.cgi: 複数キーでも検索できるようにした。 スペースで区切る。スペース入りのキーは "" で囲む。 * chalow: 複数のファイルをマージできるようにした。今までもそうできるはずだっ たのだが、できてなかった (同じ日付を上書きしてしまう)。 * chalow (clean_changelog): New. ChangeLog のクリーニング、を独立関数化。 * chalow (escape_string, unescape_string): New. 文字列置き換えから一時的に退避し、後に復帰するための関数たち。 開始マーク '\t_HTML_START_\n' と終了マーク '\t_HTML_END_\n' に囲ま れた領域はそのまま HTML ファイルへ出力する。 (設定により、行頭のタブは削られることもある) _HTML_START_ 例: フォントサイズ指定の解除 _HTML_END_ 2003-09-04 (Thu) YAMASHITA Tatsuo * chalow (write_day_page): New. 日ページ作成。 > # 日ごとにページを作るか (1:YES, 0:NO) > my $day_page_mode = 1; * chalow (make_day_list): New. 日付一覧を作成、を独立関数にした。 * chalow (datestr2anchor): New. 日付で参照リンク作成、を独立関数にした。 * clsearch.cgi: 検索用ファイルを使用するように大幅に書き換え。 Jcode.pm は不要に (もともといらなかった疑惑...)。 * chalow (write_itemlist_file): New. 検索用ファイルを出力する。検索用に itemlist を 1 ファイルにま とめたファイルを作ることにした。 > # 検索用ファイル (itemlist) を作るか (1:YES, 0:NO) > my $output_itemlist = 1; 2003-08-30 (Sat) YAMASHITA Tatsuo * version 0.19[リリース]: 公開 * 変更点のまとめ: - プラグイン機能 例: [esc]{{google_search('海老名 映画館')}}[/esc] → {{google_search('海老名 映画館')}} - 自分の日記内だけでのリファラー機能 ref. - Hiki の記法を==パクる==採用 任意の URL へのリンク、文字修飾、水平線 例:(記号は全角で表記していますが、実際は半角) [[Yahoo!|http://www.yahoo.co.jp/]] → [[Yahoo!|http://www.yahoo.co.jp/]] ==ABC== → ==ABC== ’’ABC’’ → ''ABC'' ’’’ABC’’’ → '''ABC''' - 各アイテムに記述者名を表示する機能 (for 複数人で ChangeLog) - nkf はやめて、Jcode.pm を使うようにした - RSS に も足すようにした * README: mod. * chalow (parse_entry): $descending_order_item_num 廃止。アイテムの ID は降順で固定。 * {clsearch.cgi,chalow}: 検索がしやすいように、各 item (section) の終わりをあらわすマーク を入れる方針にした。最初からこうすれば良かった...。 2003-08-29 (Fri) YAMASHITA Tatsuo * プラグイン機能[メモ]: プラグイン機能が登場! 「{」2つと「}」2つで囲むとプラグイン (関数) を呼び出すことができ ます。あんまり多くのことはできませんが...。 例:(記号は全角で表記していますが、実際は半角) > [esc]{{google_search('海老名 映画館')}}[/esc] → {{google_search('海老名 映画館')}} プラグインは cl.conf に足して置けば使えます。 in cl.conf > # ------------------------------------------------------------- > # 以下、プラグイン > sub google_search { > my ($k) = @_; > my $o = $k; > $k =~ s/([^0-9a-z_ ])/'%'.unpack('H2', $1)/gei; > $k =~ s/\s/+/g; > my $c = "ie=EUC-JP&oe=EUC-JP&"; > return qq($o); > } * chalow: 日付リンクによるリファラー、つまり、自分の日記内だけでのリファラー 機能を実装。 ref.
で囲む。 sample/diary.css にそのクラスを追加した。 テスト: [2003-06-26-2] [2003-06-26-1] [2003-06-26] * gazou.png: New! これ↓ cvs add -kb した。 [[画像|image/gazou.png]] * chalow: (get_link_str): New for Hiki 記法。そして、 get_img_str() を廃止。 * p:[IMG:image/gazou.png] [IMG:image/gazou.png http://nais.to/~yto/] * chalow (okikae): Hiki の記法を==パクる==採用。 ■任意の URL へのリンク 「単語|URL」を 2 つの半角カギカッコで囲むとを任意の URL へのリンク になります。 例:(記号は全角で表記していますが、実際は半角) > [[Yahoo!|http://www.yahoo.co.jp/]] → [[Yahoo!|http://www.yahoo.co.jp/]] このとき URL の末尾が jpg,jpeg,png,gif だと IMG タグに展開されます。 (指定した単語がALTに設定される) 例:(記号は全角で表記していますが、実際は半角) > ↓ [[図|image/gazou.png]] [[図|image/gazou.png]] 「単語」の末尾が jpg,jpeg,png,gif だとクリック可能な IMG タグに展 開されます。IMG が URL へのリンクになります。 例:(記号は全角で表記していますが、実際は半角) > ↓ [[image/gazou.png|http://nais.to/~yto/]] [[image/gazou.png|http://nais.to/~yto/]] また、URL っぽいものがあると勝手にリンクがはられます。 例: > http://www.yahoo.co.jp/ ■文字修飾の記法 「'」2個ではさんだ部分は強調されます。「'」3個ではさんだ部分はさら に強調されます。「=」2個ではさんだ部分は取消線になります。 例:(記号は全角で表記していますが、実際は半角) > ==ABC== → ==ABC== (ABC) > ’’ABC’’ → ''ABC'' (ABC) > ’’’ABC’’’ → '''ABC''' (ABC) ■水平線の記法 マイナス記号「-」を行の先頭のタブの後から 4 つ書くと水平線になりま す。 例:(記号は全角で表記していますが、実際は半角) > あはは > −−−− > いひひ あはは ---- いひひ 2003-08-25 YAMASHITA Tatsuo * chalow: 日付だけでなく記述者も考慮するようにしなくちゃ本来の ChangeLog (複 数の人々が開発に用いるという状況) で使えない。普及の壁??? そこで、 記述者が複数いる ChangeLog ファイル用に、各アイテムに記述者名を表 示するモードを作った。 in cl.conf: > # 各アイテムに記述者名を表示するか (1:YES, 0:NO) > $show_author_name = 0;
名前
「author name」 ref. 2003-08-16 YAMASHITA Tatsuo * README: mod. nkf が必要、との記述を削除。 * clsearch.cgi: 検索で日付が出て来なくなっていたのを修正。 2003-08-11 (Mon) YAMASHITA Tatsuo * clsearch.cgi: nkf はやめて、Jcode.pm を使うようにした。 * chalow: nkf を呼ぶのはやめて、Jcode.pm を使うようにした。 (write_rss_file): utf-8 への文字コード変換に Jcode を使うようにし た。ゆえに、chalow 0.18 から必要となった「nkf 2.0 以降」は不要。 - 他の場所でも nkf 使うのやめた。 - FileHandle も使うのやめた。 - memo: Cygwin へ Jcode.pm 2003-08-09 YAMASHITA Tatsuo * clsearch.cgi: CSS がらみでちょっと修正。 2003-08-08 (Fri) YAMASHITA Tatsuo * chalow (write_rss_file): RSS に も足すようにした。日付だけで、時間はなし。 例: 2003-08-03 2003-08-03 YAMASHITA Tatsuo * version 0.18[リリース]: 公開 * add-extent.pl: 毎回 extent 情報を調べるのは時間がかかるので cache ファイルを採用。 2003-07-31 YAMASHITA Tatsuo * RSS (RDF): RSS を出力するようにした。 今のところ、RDF の文字コードは euc-jp。utf-8 でないと正しく動かな い RSS 処理ソフトがあるらしい。どうしたものか。 (ref. RSS -- サイト情報の要約と公開 ) → nkf -w でなんとかする。しかし、nkf は新しいのじゃなきゃならぬ。 * chalow: (parse_entry): mod for RSS %all_items というハッシュに全アイテム情報を詰め込む。 (write_rdf_file): New. for RSS output. (parse_entry): パーズして結果をハッシュに詰め込むようにした。 パーズと生成を別パスにした。 * {chalow,cl.conf}: 新たな設定項目を追加 > # RSS を出力するか (1:YES, 0:NO) > my $output_rss = 1; > # ChangeLog を公開する URL (相対 URL 不可) > my $clog_url = "http://nais.to/~yto/clog"; > # 他の年の同じ日付 (月日) へのリンクを張るか (1:YES, 0:NO) > my $same_date_jump = 1; * cl2moneycsv.pl: New. ChangeLog メモで家計簿っぽいことをするためのもの。 ChangeLog メモから買物ログを抜きだして CSV にする。 (ref. ) 2003-07-30 (Wed) YAMASHITA Tatsuo * chalow: 他の年の同じ日付 (月日) へのリンクを付ける機能 (same date jump) を テスト的に実装。例えば、日付 (エントリヘッダー) の下に過去数年の 7/30 の記述へのリンクが表示される。 ぱくり元: > 凹 n年日記 > 他の年の同じ月に日記をつけている場合のみ[n年日記]というリンクが > 現れるようになりました.[n年日記]が現れるまで頑張って日記をつけ > 続けてください.それからn年日記モードでは[n年日記]のリンクを表示 > しないようにしました. * chalow: 「最近の何日かだけインデックスページに載せるための処理」を全体ルー プの外へ出した。 $top_n_ctr が関係する。 2003-07-23 (Wed) YAMASHITA Tatsuo * {chalow,cl.conf}: Add 「type="text/javascript"」 ref. 2003-07-15 (Tue) YAMASHITA Tatsuo * chalow (parse_entry): item header 以外の行が「\t*」で始まると、それ以降が消えてしまうと いうバグ [chalow:23] に対処。 例: a b * c 原因は item を認識する正規表現。 > # (3) 個々の item に分解し、各 item ごとに処理 > my @itemlist; > while ($items =~ /^(\t\* .+?\n(?=\s*(\t\*|\Z)))/gsm) { > push @itemlist, $1; > } ↓ > while ($items =~ /^(\t\* .+?\n(?=\s*(\t\* |\Z)))/gsm) { 2003-07-12 YAMASHITA Tatsuo * version 0.17[リリース]: 公開 * memo: くっつき BBS = 2003-07-08 (Tue) YAMASHITA Tatsuo * chalow (parse_entry): くっつき BBS にあわせて、TUKKOMI_DATE の仕様を変更。 old: $template =~ s/TUKKOMI_DATE/$day/g; new: $template =~ s/TUKKOMI_DATE/$mon.html%23$day/g; old: > 本日のツッコミ [全部 > 見る / ツッコミを入れる] new: > 本日のツッコミ [全部 > 見る / ツッコミを入れる] 2003-07-01 (Tue) YAMASHITA Tatsuo * {chalow,cl.conf}: mod $item_header_mark (ref. [2003-06-26-1]) > # item header の先頭の記号の指定 > # 『日記のセクションの先頭(サブタイトルの行頭)に挿入される、リンク用の > # アンカー文字列を指定します。なお「_」を > # 指定すると、テーマによっては自動的に画像アンカーがつくようになりま > # す。』(tDiary の skel/conf.rhtml より) > $item_header_mark = "*"; version 0.15 以降、panchor に決め打ちにしてしまっていたが、sanchor もあるわけなので、設定できるようにした。 2003-06-29 (Sun) YAMASHITA Tatsuo * sample/diary.css: update * check-tr.png: New for sample CSS * {chalow,cl.conf}: 新たな設定項目を追加 > # ツッコミ機能を使用するか (1:YES, 0:NO) > my $use_tukkomi = 1; > # ツッコミのテンプレート =
...
の中味。 > # TUKKOMI_DATE はそのエントリの日付 (例: 2003-06-25) に変換される > my $tukkomi_template = qq( >
> 本日のツッコミ [全部 > 見る / ツッコミを入れる] >
> > ); * chalow: 試験的にツッコミ機能を使えるようにした。ツッコミ機能自体は外部のシ ステムを利用。この部分については今後大幅な変更の可能性大。 2003-06-26 YAMASHITA Tatsuo * README (usage): add * chalow (okikae): - リンク付き画像張り付けをできるようにした。サムネイルと拡大画像な どに。画像からの URL へのリンクも可能。 > [IMG:image/hello-s.jpg image/hello.jpg] > [IMG:image/hello-s.jpg http://example.com/hoge.html] (正しい表記は、半角コロンです) - URL 文字列のマッチパターンをいじる。 * chalow (parse_entry): item header の処理のところのロジック変更。 * {chalow,cl.conf}: 新たな設定項目を追加 > # item header の先頭の記号の指定 > my $item_header_mark = "*"; 2003-06-24 YAMASHITA Tatsuo * README: mod. ref. 2003-06-23 (Mon) YAMASHITA Tatsuo * version 0.16[リリース]: 公開 * chalow (parse_entry)[メモ]: > tDiary のテーマも使えるようになると見栄えが全然違いますな。 > ただ、惜しむらくは、* に張られるアンカー。 > ChangeLog 形式なので、上にどんどん書かれていく。 > 一日に何回も更新するとアンカーのラベルが変わってしまう。 > その日に書いたエントリから順番に 1, 2 と付けて欲しい。 確かに。そうなんですよね。ということで、デフォルトを降順にしました。 上のアイテムから、5, 4, 3, 2, 1 となります。version 0.15 のように 昇順にするには、cl.conf で $descending_order_item_num = 0 とすれば OK。 * {chalow,cl.conf}: 新たな設定項目を追加 > # item header の先頭の "*" のアンカー番号を降順にするか (1:YES, 0:NO) > my $descending_order_item_num = 1; 2003-06-22 YAMASHITA Tatsuo * version 0.15[リリース]: 公開 * README: mod * sample/ChangeLog: remove * chalow: tDiary テーマ適用の調整。各 item を p で囲むようにした。 * ChangeLog の各部の名称[メモ]: chalow では各部を以下のように呼ぶことにします。 設定ファイル、CSS、プログラムソースを見るときにご参照下さい。 [[IMG|image/chalow-cl-name-s.gif]] * 半角スペース連続が消えてしまう問題[メモ]: pre の代わりに p とか div とかで "white-space: pre; font-family: monospace;" と指定する方法は、以下のような「半角スペース連続」表記 で崩れるという問題がある。item を pre で囲むのはいまいちな感じでは あるが、今しばらくはやむを得ない。 これが... > 4 5 6 7 8 9 10 > ┴───┴───┴───┴───┴───┴───┴ > - 階層1 > - 階層2 > - 階層3 こうなる > 4 5 6 7 8 9 10 > ┴───┴───┴───┴───┴───┴───┴ > - 階層1 > - 階層2 > - 階層3 2003-06-21 YAMASHITA Tatsuo * README: tDiary のテーマを使うための設定について。 * {chalow,cl.conf}: tDiary のセクションアンカーみたいなのを実装。使うには、新設定項目 $use_item_anchor を 1 にする。 > # item header の先頭の "*" にアンカーをつけるか (1:YES, 0:NO) > $use_item_anchor = 1; $item_header_style の設定で、"* HOGE:" か "* HOGE" にしておく必要 あり。 これにともない、okikae() 中の「日付で参照リンク」を修正。 - item anchor への参照リンクの記述方法の例: [2003-06-21-1]。 - もちろん今までの [2003-06-21] というのも使える。 - テスト: [2001-12-13-3] [2001-12-02] [2001-12-08-2](ない) * {chalow,cl.conf,sample/diary.css}: - デフォルトの設定として、月ページリスト、日付リストを calendar ク ラスの p で囲む。 - 一番下に出る chalwo ロゴを p.footer にした。p.footer a で bold がデフォルト。 -

: ページトップなどにある自分のホームページ へのリンクなど。 - デフォルトで、各 item header の先頭の "*" を panchor クラスで囲 む → "div.day span.panchor"。 "*" をイメージにもできる。 $item_header_style の設定で、"* HOGE:" か "* HOGE" にしておく必 要あり。 2003-06-20 (Fri) YAMASHITA Tatsuo * README: mod * chalow (parse_entry): New. ChangeLog 処理のロジックを変更した。 main -> okikae() という呼び出し関係が、 main -> parse_entry() -> okikae() に。 * chalow: CSS ファイルをコマンドラインから指定できるようにした。 いろいろなテーマが簡単に試せる。Ex: --css=hoge.css * {sample/diary.css,cl.conf,chalow}: - tDiary の CSS と共通にする作戦: h1 はページタイトルっていうのは 決め打ちでも良いと思うが、h2 を日記の各日付のタイトルと決め打ち されていたのでちょっと困った。で、従うことにする。修正。 - その他いろいろ * {chalow,cl.conf}: 新たな設定項目を追加 > # 表示するとき引用記号 ('>' or '|') を消すか (1:YES, 0:NO) > my $remove_quote_mark = 0; > # item header に h3 タグを足すか (1:YES, 0:NO) - tDiary との互換性のため > my $use_h3_for_item_header = 0; change var name: $old_style_item_header --> $item_header_style * chalow (okikae): - 引用を blockquote にするようにした。 "div.body blockquote" で指 定。 2003-06-19 (Thu) YAMASHITA Tatsuo * chalow: ユーザ設定ファイルの読み込み時のエラーを出力するようにした。(use $@) * clsearch.cgi: - div 囲み entry に対応。 - clsearch.cgi の検索結果に "前へ" と "次へ" も表示するようにした。 * chalow: 佐藤さんからのフィードバック (030218) を参考に、正しいHTML を出力 するようにしよう! ... と思ったが途中で挫折。 -

- -> - 全体を div で囲む * chalow: - tDiary の CSS と共通にする作戦 - 各 entry を
で囲むようにした。 - 各 item を
で囲むようにした。 - 1 entry 内の複数の item を
で囲むよう にした。 - 全体を pre で囲むのをやめる * sample/diary.css: add new classes * {chalow,cl.conf}: 新たな設定項目を追加 > # タブによるインデントをなくすか (1:なくす or 0:そのまま) > my $no_indent = 0; > # アイテムヘッダーのフォーマットをどうするか (0:"* HOGE:", 1:"HOGE:",2:"HOGE") > my $old_style_item_header = 1; > # インデックスページの HTML ヘッダに追加したいもの (favicon.ico など) > my $index_page_head_plus = ""; > # 月ページの HTML ヘッダに追加したいもの > my $month_page_head_plus = ""; * chalow (okikae): - 日付を h3 タグと date クラスの span で囲むようにした。CSS でいじ りやすくするため。 - アイテムヘッダーを で囲むよう にした。 - URL 変換で、ftp:// も変換するようにした。(ishii-k さんからのフィー ドバック (030616)) 2003-06-14 YAMASHITA Tatsuo * version 0.14[リリース]: 公開 * README: mod 2003-06-12 YAMASHITA Tatsuo * clsearch.cgi: 検索結果で、月ページでトップに表示されるエントリの日付が表示されな いバグを修正。(ad hoc. 全体的に手を入れなおす必要があるかも) 2003-06-11 YAMASHITA Tatsuo * clsearch.cgi: "nkf -e" --> "nkf -ed" (\r\n 問題) 2003-06-09 YAMASHITA Tatsuo * chalow (make_month_page_list): 何回も呼び出されても効率に影響な いように cache するようにした。 (write_month_page): MONTHPAGELIST を月ページのテンプレートでも使え るようにした。 * test-add-extent.html: add-extent.pl のテスト用 HTML ファイル。 * chalow: こっそり作ってた expert-mode を削除。 * add-extent.pl: New. HTML の img タグに width と height を足すス クリプト。これにより、同じことを行う秘密の expert-mode が不要になっ た。 2003-05-31 YAMASHITA Tatsuo * chalow: "nkf -e" --> "nkf -ed" (念のため) 2003-05-30 (Fri) YAMASHITA Tatsuo * {cl.conf,chalow}: ユーザ設定用の変数 $index_page_header, $index_page_footer, $month_page_header, $month_page_footer を削除。 代わりに $index_page_template, $monthd_page_template を追加。 ### obsolete my $index_page_header; # インデックスページのヘッダ my $index_page_footer; # インデックスページのフッタ my $month_page_header; # 月ページのヘッダ my $month_page_footer; # 月ページのフッタ * テンプレート方式とは[メモ]: $index_page_template, $monthd_page_template に body 内部の内容を 「内部置き換え文字列」などを用いて表現する方式。 カスタマイズ (レイアウト) の自由度を高めるために採用。 * chalow (make_month_page_list): - change name from write_month_page_list(). - print --> $rv .= "..." (write_month_page): テンプレート方式にする。 (write_index_page): テンプレート方式にする。 * 内部置き換え文字列: update 030619. 最新情報は cl.conf を見て! - 月ページ用 CLNAVI: 先月来月ページへのリンク YEARMONTH: YYYY-MM DAYLIST: 日付リスト DAYSINTHEMONTH: その月の全エントリ - インデックスページ用 MONTHPAGELIST: 月別一覧 LATESTDAYS: 最近 N 日分のエントリ NDAYS: 「最近 N 日分」の N CLLASTUPDATE: 最終更新時間 2003-05-29 YAMASHITA Tatsuo * chalow (okikae): 引用 (citation)。 タブの後に "|" か ">" が来る行は引用とみなし、CSS の clquote クラ スな span で囲む。 | ... > 引用 > 引用 > 引用 > これは引用ではない | 引用 | 引用 | これは引用ではない (→[2003-06-20])
に変更 "div.body blockquote" で指定 2003-03-31 YAMASHITA Tatsuo * chalow: 新オプション。処理停止日付 ($stop_date)。この日付まで処 理する。 例: --stop-date "2002-01-01" 未指定なら最後まで処理する 2003-03-13 YAMASHITA Tatsuo * clsearch.cgi: 文字化け対策。 HTTP header ref. 2003-01-18 (Sat) YAMASHITA Tatsuo * version 0.13[リリース]: 公開 * README (usage): clweek.pl についての記述を追加 * clweek.pl: New. 日付フォーマットを曜日入りのに変換するフィルタ。 ref. * chalow: 曜日入り日付フォーマットに対応。 例: 2000-06-12 (Mon) YAM Tat ref. 2003-01-05 (Sun) YAMASHITA Tatsuo * version 0.12[リリース]: 公開 * README: 更新 * chalow (okikae): キーワードの強調[2002-12-28]の廃止。 * cl-simple.conf: delete. use "cl.conf" * chalow: ChangeLog をパーズするループを書き換える。いじりやすくし た。 (get_last_day_of_month): New. 年月を入力としその月の最終日を出力す る関数。 (write_month_page): 月ページに、日へのリンク (日付一覧) を出せるよ うにした。 (write_month_page): 月ページに、表示する日付の順番を調整できるよう にした。降順 or 昇順。今までは、降順だけだった。 - 月ページで、日付を降順 (新しい日付が上) で表示するか (1:yes or 0:no) $reverse_order_days = 1; 2002-12-28 (Sat) YAMASHITA Tatsuo * chalow (okikae): (030105: 機能廃止。「自動文字列置換」でやっても らう方針にした。[[README に解説]]を書いた。以下の記述は obsolete) あんまり機能を追加するのは嫌なんだけど、*キーワードの強調*をできる ようにした。そのうち変更するかも。 強調したい文字列を * で囲む。内側のすき間にスペースや記号が入って はダメ。 - 悪い例: こんにちは * ほげぴー * です! いわゆる *よろしく!* また、"<" を変換する正規表現を書き換えた。残したいタグをカスタマイ ズしやすくなったかな。詳しくはソースを。 2002-12-27 (Fri) YAMASHITA Tatsuo * version 0.11[リリース]: 公開 * chalow (write_month_page_list): 月別一覧表示を改造。記述の無い月 も一覧に表示するようにした。 - 改造のきっかけは 12/17 の高久さんからのバグ報告メール。12 月の記 述がないと次の年が改行されずにつづくというバグ。 2002-11-24 (Sun) YAMASHITA Tatsuo * sample/diary.css: ちょっと修正。行間をあけたり。 2002-10-29 (Tue) YAMASHITA Tatsuo * README: URL 改行についての解説を書き忘れていたので書く。 2002-10-26 (Sat) YAMASHITA Tatsuo * version 0.10[リリース]: 公開 2002-10-25 (Fri) YAMASHITA Tatsuo * chalow (okikae): バックスラッシュを用いたURL中での改行に対応。 例: URL 用正規表現も修正。 2002-10-19 (Sat) YAMASHITA Tatsuo * version 0.9[リリース]: 公開 2002-10-18 (Fri) YAMASHITA Tatsuo * chalow (okikae): "&" を "&amp;" に置き換えるようにした。 IEで「&region」が「(R)ion」になってしまったから。 →でも、やっぱやめた。「;」もないのにエンティティ変換しちゃうのに まで対応するのは馬鹿らしい。ハートを出したいときの「&hearts;」 とかも使えなくなっちゃうし。変になったらその都度「&amp;region」 みたいにして下さい。 2002-10-01 (Tue) YAMASHITA Tatsuo * README: 月ページのヘッダとフッタについての記述を追加。 * cl.conf, sample/cl-sample.conf: - 日付の後に曜日(Mon, Tue, ...)を表示するか (1:yes or 0:no)。 $show_day_of_week = 1; - 月ページのヘッダ、フッタのデフォルト変更 * chalow (write_month_page): 月ページ移動ナビ (前後の月ページへの リンク) を表示できるようにした。 * chalow: 日付文字列の後に曜日(Mon, Tue, ...)を追加するようにした。 また、日付の後に曜日(Mon, Tue, ...)を表示するか否かの切り替えの仕 組みを追加 (デフォルトは表示する)。 * chalow (get_day_of_week): New. 年月日を入力とし曜日を出力する関 数 2002-08-09 (Fri) YAMASHITA Tatsuo * README: はずかしい間違いをこっそり修正。その他追加。 2002-06-29 (Sat) YAMASHITA Tatsuo * version 0.8[リリース]: 公開 * clsearch.cgi: new. パッケージに追加してみた。 * chalow (okikae): URL 用正規表現を修正。 s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+ → s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#,]+ こんな URL があるもんだから。 http://k-tai.impress.co.jp/cda/article/todays_goods/0,,9722,00.html 2002-06-28 (Fri) YAMASHITA Tatsuo * chalow (get_img_str): add alt. 他にもいろいろ機能ダウン。 2002-06-24 (Mon) YAMASHITA Tatsuo * chalow (okikae): "" といった "<", ">" でくくった URL 表記に対応。修正の手順: (1) "<" と ">" をエスケープしていたのを、 "<" だけにする。 (2) URL にマッチする正規表現を変更。 2002-06-23 (Sun) YAMASHITA Tatsuo * version 0.7[リリース]: 公開 * chalow (write_month_page): $month_page_header 中の YEARMONTH と いう文字列を、"年-月" 文字列 (例えば、"2002-06") に置き換えるよう にした。ad hoc で嫌なんだけど、良い方法が思いつかない...。 2002-06-22 (Sat) YAMASHITA Tatsuo * diary.css: New. サンプル。taku-ku のをパクる。 * chalow: chalow 普及のため HTML の一番下に chalow home page への リンク表示するようにした。最初からやっておけばよかった... * README: 改定 * chalow: CSS に対応。 $css_file でスタイルシートファイルを指定す る。 * cvs: CVS による管理開始。 2001-12-16 (Sun) YAMASHITA Tatsuo * version 0.6[リリース]: 公開 * chalow: [2001-12-13] にやった「見出しにマッチする正規表現」の調整の続き。 「s!\t\* ([^:\n]+): !\...」を「s!\t\* ([^:\n]+):(\s)!\...」に変更。 masata-y 氏の意見に従って、「#!/usr/local/bin/perl」を 「#!/usr/bin/env perl」に変更 (感謝!)。 2001-12-13 (Thu) YAMASHITA Tatsuo * version 0.5[リリース]: 公開 * README: 手直し。 * chalow: 落ち着いて考えたら、ユーザ設定ファイルがないと使えない [2001-12-04]ってのは、あんまりなので、ソースにデフォルト設定を埋め 込んだ。ユーザ設定ファイル指定なしだと極めてシンプルな Web ページ に変換される (ま、そもそもシンプルだけどね)。 * chalow (okikae): 項目の見出しに色づけ処理をちょっと変更。見出し にマッチする正規表現を「s!\t\* ([^:\n]+):!\...」から 「s!\t\* ([^:\n]+): !\...」に変更 (コロン後にスペースを追加)。これ で、見出しのない項目も安心。 2001-12-09 (Sun) YAMASHITA Tatsuo * version 0.4[リリース]: 公開 2001-12-08 (Sat) YAMASHITA Tatsuo * chalow: New option '-e'. expert-mode. ソース見て処理内容が分かる 人向けモード。[2001-12-07]の identify がらみの処理など。README に は載せないつもり。 (write_month_page): Add in (write_index_page): Add in 2001-12-07 (Fri) YAMASHITA Tatsuo * chalow (get_img_str): 自分用に、ImageMagick の identify で、 画像の extent を得る処理を付け加えた。identify がなければ何もしな い。 extent が必要な理由: IE で日付参照リンクをクリックすると、きちんと その日付のとこに飛ぶ。しかし、しばらくして画像が全部読み込まれてレ イアウトしなおされると、飛んだ場所がずれちゃう。結果として、正しい 日付へジャンプできないことがあるわけ。 問題点: 変換処理が遅くなる。まあ、しょうがない。いそぐもんじゃない からいいかな。 2001-12-04 (Tue) YAMASHITA Tatsuo * chalow: ユーザ設定ファイル名が存在しないときエラーで中止するよう にした。 2001-12-02 (Sun) YAMASHITA Tatsuo * version 0.3[リリース]: 公開 * README: 手直し。 * chalow: New option '-q'. quiet mode. 標準出力に進捗情報を出すこ とにしたので、quiet mode も作った。 * ファイル移動: ChangeLog-sample → sample/ChangeLog, cl-simple.conf → sample/cl-simple.conf (thanks to satoru-t) * version 0.2[リリース]: 公開してみる。 * cl-simple.conf: パッケージに追加。README の実行例で使用。 * chalow: - ユーザ設定ファイルを指定する新オプション -c, --configure-file=FILE を追加。 - 最初にファイルを読み込むときに EUC に変換するのを忘れてたので修 正。(version 0.1 では、JIS ファイルだとおかしくなる) * README: 誤り訂正。 2001-12-01 (Sat) YAMASHITA Tatsuo * version 0.1[リリース]: 公開してみる。Web ページも作る。 ==http://nais.to/~yto/tools/chalow/== http://chalow.net/ * chalow: 軽く手入れ。 * README: 公開にそなえて README を書き始める。 __DATA__ あああ いいい chalow-1.0/ChangeLogReader.pm0000755000076600007660000001104010276263422014366 0ustar ytoytopackage ChangeLogReader; use strict; #use vars qw(@ISA @EXPORT $VERSION $OLD_CODE); #require Exporter; #@ISA = qw(Exporter); #@EXPORT = qw(store_changelog store_entry store_entry2 debug_print); #$VERSION = '0.1'; sub new { my $class = shift; my $self = {}; my %param = @_; for (keys %param) { $self->{lc($_)} = $param{$_} } return bless $self, $class; } sub debug_print { my ($self) = @_; foreach my $ymd (reverse sort keys %{$self->{all}}) { my $ent = $self->{all}->{$ymd}; print "=" x 60, "\n"; print "ENTRY ID: $ymd\n"; print "message-top:",$ent->{'message-top'},"\n" if (defined $ent->{'message-top'}); print "message-bottom:",$ent->{'message-bottom'},"\n" if (defined $ent->{'message-bottom'}); for (my $i = $ent->{curid}; $i >= 1; $i--) { print "-" x 60, "\n"; print "ITEM ID: $ymd-$i\n"; print "ITEM HEADER:>>>>",$ent->{$i}->{ho},"<<<<\n"; print "ITEM CATEGORY:",join(",",@{$ent->{$i}->{cat}}),"\n" if (defined $ent->{$i}->{cat}); print "ITEM AUTHOR:>>>>",$ent->{$i}->{a},"<<<<\n"; print "ITEM CONTENT:>>>>",$ent->{$i}->{co},"<<<<\n"; } } } sub store_changelog_file { my ($self, $fname) = @_; open(F, $fname) || die "file open error $fname : $!"; binmode(F); my @entlines; while () { if (/^(\d{4}-\d\d-\d\d)/) { $self->store_entry(\@entlines) if (@entlines > 0); @entlines = (); } elsif (/^\t?__DATA__.*$/) { last; } push @entlines, $_; } $self->store_entry(\@entlines) if (@entlines > 0); close F; } sub store_entry { my ($self, $linesp) = @_; # Processing entry header my $eh = shift @$linesp; return unless ($eh =~ /^\d{4}-\d\d-\d\d/); my ($ymd, $y, $m, $d, $user) = ($eh =~ /^((\d\d\d\d)-(\d\d)-(\d\d))(?:.*?\s\s)(.+)?/); $self->{all}->{$ymd}->{eh} = $ymd; my $entp = $self->{all}->{$ymd}; $user =~ s//>/g; # print "($ymd, $y, $m, $d, $user) \n"; # print "<<<<<$eh>>>>>>>\n"; # Processing each item my @ilines; my @items; foreach (@$linesp) { if (s/^( {8}| {0,7}\t|)\* //) { push @items, [@ilines] if (@ilines > 0 and $ilines[0] !~ /^\s*$/); @ilines = (); } push @ilines, $_; } push @items, [@ilines] if (@ilines > 0 and $ilines[0] !~ /^\s*$/); foreach (reverse @items) { $self->store_item($entp, $_, $ymd, $user); } if ($entp->{curid} == 0) { # If the entry doesn't have any item, delete it. # It will be happend when all items in the entry are private items. # Notice: pragma items are ignored. delete $self->{all}->{$ymd}; return; } my $ent = $self->{all}->{$ymd}; for (my $i = $ent->{curid}; $i >= 1; $i--) { if (defined $ent->{$i}->{cat}) { map {$self->{CAT}->{$_}++} @{$ent->{$i}->{cat}}; } } $self->{STAT}->{ym}{$y."-".$m}++; # for month_page_list $self->{STAT}->{md}{$m."-".$d}{$y} = 1; # for SameDateJump # {"ym"} : 各年月に含まれている日付エントリ数 # {"md"} : 同じ月日を持つ年 for same date jump if ($self->{stop_date} != 0) { my $cdate = $y * 10000 + $m * 100 + $d; if ($self->{stop_date} > $cdate) { delete $self->{all}->{$ymd}; } } } # 文字コードを euc にしておく??????? sub store_item { my ($self, $entp, $linesp, $ymd, $user) = @_; # $entp = $self->{all}->{$ymd}; my $ih = shift @$linesp; # item header - case 1: "* AAA: \n" # item header - case 2: "* AAA:\n" # item header - case 3: "* AAA: BBB\n" # item header - case 4: "* AAA\n" my ($rest) = ($ih =~ s/:(\s.*)$/:/s) ? $1 : ""; # for case 1,2,3 $rest =~ s/^ +//; my $cont = $rest.join("", @$linesp); if ($ih =~ /^p:/) { # Ignoring private items return; } elsif ($ih =~ /^(message-top|message-bottom):/) { # pragma items $entp->{$1} = $rest.$cont; return; } # item ID : Y in XXXX-XX-XX-Y $entp->{curid}++; # Processing item header # # If 1st line doesn't have ": ", it will become item header. my @cat; # $ih =~ s/(:|\s+)$//g; $ih =~ s/(:|\s*)$//sg; # Triming trailing spaces and ":" # print "[[[[$ih]]]\n"; if ($ih =~ s/\s*\[(.+)\]$//) { # category @cat = split(/\s*\]\s*\[\s*/, $1); } # Processing item content $cont =~ s/^( {8}| {0,7}\t)//gsm; $cont =~ s/\s+$/\n/g; # Triming trailing spaces and CR $cont =~ s/\r//g; # Storing item information in hash $entp->{$entp->{curid}}{ho} = $ih; $entp->{$entp->{curid}}{co} = $cont; $entp->{$entp->{curid}}{a} = $user if (defined $user); @{$entp->{$entp->{curid}}{cat}} = @cat if (@cat > 0); # print "<<<<<$ih>>>>>>>\n"; } 1; chalow-1.0/cl.conf0000644000076600007660000003646310706122476012341 0ustar ytoyto# -*- perl -*- ### ユーザ設定項目 ### # -------------------------------------------------------------------- # 日記の名前 $changelog_name = "ChangeLog"; # -------------------------------------------------------------------- # ChangeLog を公開する URL (絶対 URL を強く推奨) - RSS に必要 # 例: $clog_url = "http://chalow.net/"; $clog_url = "."; # 必ず URL を設定して下さい # -------------------------------------------------------------------- # インデックスページ (index.html) で最近何日分を表示するか # (コマンドラインオプション "-n" でも指定できます) $opt_topn = 7; # -------------------------------------------------------------------- # 日ごとにページを作るか (0:NO, 1:YES) --- obsolete #$day_page_mode = 1; # -------------------------------------------------------------------- # 作成するページの単位 (0:月, 1:日, 2:アイテム) $page_mode = 1; # -------------------------------------------------------------------- # 自動文字列置換 $auto_replace = ' s!(
)!

$1!g; s!(
)!$1

!g; s!(chalow)(<|\s|[\x80-\xff]|$)!$1$2!g; '; # -------------------------------------------------------------------- # ファイルの最初に出てくる「」を置き換える文字列 $replace_once = << "__REPLACE_ONCE" __REPLACE_ONCE ; # -------------------------------------------------------------------- # CSS ファイル $css_file = "diary.css"; #$css_file = "clover/clover.css"; # -------------------------------------------------------------------- # RSSファイル名 $rss_filename = "cl.rdf"; # -------------------------------------------------------------------- # RSSに最近何日分表示するか(0の場合は $opt_topn と同じ) $rss_topn = 0; # -------------------------------------------------------------------- # 日付の後に曜日(Mon, Tue, ...)を表示するか (1:yes or 0:no) $show_day_of_week = 1; # -------------------------------------------------------------------- # 月ページで、日付を降順 (新しい日付が上) で表示するか (1:yes or 0:no) $reverse_order_days = 1; # -------------------------------------------------------------------- # アイテムヘッダーのフォーマットをどうするか # (0:"* HOGE:", 1:"* HOGE", 2:"HOGE:",3:"HOGE") $item_header_style = 1; # -------------------------------------------------------------------- # 表示するとき引用記号 ('>' or '|') を消すか (1:YES, 0:NO) $remove_quote_mark = 1; # -------------------------------------------------------------------- # item header で h3 タグを使うか (1:YES, 0:NO) - tDiary との互換性のため $use_h3_for_item_header = 1; # -------------------------------------------------------------------- # item header の先頭の記号にアンカーをつけるか (1:YES, 0:NO) $use_item_anchor = 1; # -------------------------------------------------------------------- # item header の先頭の記号の指定 # 『日記のセクションの先頭(サブタイトルの行頭)に挿入される、リンク用の # アンカー文字列を指定します。なお「_」を # 指定すると、テーマによっては自動的に画像アンカーがつくようになりま # す。』(tDiary の skel/conf.rhtml より) $item_header_mark = qq(); # -------------------------------------------------------------------- # RSS を出力するか (1:YES, 0:NO) $output_rss = 1; # -------------------------------------------------------------------- # 日記の説明 for RSS : 例: "日々のあれこれ。" $changelog_description = "日々のあれこれ。"; # -------------------------------------------------------------------- # 他の年の同じ日付 (月日) へのリンクを張るか (1:YES, 0:NO) $same_date_jump = 1; # -------------------------------------------------------------------- # 日付一覧をカレンダー表示にするか (1:YES, 0:NO) $calendar_style = 0; # -------------------------------------------------------------------- # 検索用ファイル (cl.itemlist) を作るか (1:YES, 0:NO) $output_itemlist = 1; # -------------------------------------------------------------------- # 見出し一覧 (JavaScript ファイル) で出力する日数 $latest_titles_num = 10; # -------------------------------------------------------------------- # カテゴリページを作るか (0:NO, 1:YES) $output_cat_pages = 0; # -------------------------------------------------------------------- # カテゴリページ中のエントリ数の上限 # ($output_cat_pages = 1 のときのみ有効) $cat_page_entry_max = 20; # -------------------------------------------------------------------- # カテゴリ別item表示のためのCGIを指定する(カテゴリ名は %%CAT%% で置き換え) # ($output_cat_pages = 0 のときのみ有効) $cat_page_cgi = "clsearch.cgi?cat=%%CAT%%"; #$cat_page_cgi = ""; ###################################################################### ## テンプレート # (サイドメニュー、サイドバー) my $side_menu = << "___SIDE_MENU"

ChangeLogを検索

カテゴリ

最近の話題

過去ログ

___SIDE_MENU ; # インデックスページのテンプレート $index_page_template = << "___INDEX_PAGE_TEMPLATE" <TMPL_VAR name=cl_name>

最新 / RSS

/

最近 日分 / 今月の一覧

最終更新時間:

___INDEX_PAGE_TEMPLATE ; # 月ページのテンプレート $month_page_template = << "___MONTH_PAGE_TEMPLATE" <TMPL_VAR name=cl_name> / <TMPL_VAR name=ym>

前の月 / 次の月 / 最新

/

最終更新時間:

___MONTH_PAGE_TEMPLATE ; # 日ページのテンプレート $day_page_template = << "___DAY_PAGE_TEMPLATE" <TMPL_VAR name=cl_name> / <TMPL_VAR name=ymd>

前の日 / 次の日 / 最新 /

/

最終更新時間:

___DAY_PAGE_TEMPLATE ; # アイテムページのテンプレート #$item_page_template = << "___PAGE_TEMPLATE" # カテゴリページのテンプレート $cat_page_template = << "TMPL" <TMPL_VAR name=cat_name> / <TMPL_VAR name=cl_name> ChangeLog 最新ページ / カテゴリ最新ページ / 前ページ 次ページ / page ()

-

最終更新時間:

TMPL ; # item のテンプレート $item_template = << "EACHITEM"

続きを読む

Referrer (Inside):
EACHITEM ; # entry (date) のテンプレート $entry_template = << "DAYENTRY"

Referrer (Inside):
DAYENTRY ; ###################################################################### ## プラグイン ### コメントアウト # usage: {{com('これは HTML 変換時に削られます')}} sub com { } ### clsearch キーワード検索 URL 作成 # usage: {{clsearch('海老名 映画館')}} # usage: {{clsearch('海老名 映画館', 1)}} sub clsearch { my ($k, $mode) = @_; my $o = $k; $k =~ s/([^0-9a-z_ ])/'%'.unpack('H2', $1)/gei; $k =~ s/\s/+/g; $mode = "&mode=$mode" if (defined $mode); return qq($o); } ### google キーワード検索 URL 作成 # usage: {{google_search('海老名 映画館')}} sub google_search { my ($k) = @_; my $o = $k; $k =~ s/([^0-9a-z_ ])/'%'.unpack('H2', $1)/gei; $k =~ s/\s/+/g; my $c = "ie=EUC-JP&oe=EUC-JP&"; return qq($o); } ### Bulkfeeds キーワード検索 # usage: {{bulkfeeds('海老名 映画')}} sub bulkfeeds { my ($k) = @_; my $o = $k; $k = Jcode->new($k)->utf8; $k =~ s/([^0-9a-z_ ])/'%'.unpack('H2', $1)/gei; $k =~ s/\s/+/g; return qq($o); } ### amazon リンクの作成 # usage: {{amazon('ASIN', 'STR')}} sub amazon { my ($asin, $str) = @_; my $prefix = "http://www.amazon.co.jp/exec/obidos/ASIN"; # my $suffix = ""; my $suffix = "ytoshomepage-22/ref=nosim"; # アソシID使用時 $str =~ s/(\s|^)(\S+\.(jpg|jpeg|png|gif))/$1/gi; $str =~ s/$/
/gm; $str =~ s/
\Z//m; return qq($str); } sub az {amazon(@_)} sub azs {amazon_search(@_)} sub bf {bulkfeeds(@_)} sub cls {clsearch(@_)} sub gs {google_search(@_)} ### amazon サーチ結果リンクの作成 # usage: {{amazon_search('STR' [,'MODE'])}} sub amazon_search { my ($str, $mode) = @_; my $k = Jcode->new($str)->utf8; $k =~ s/([^0-9a-z_ ])/'%'.unpack('H2', $1)/gei; $k =~ s/\s/+/g; my $aid = "ytoshomepage-22"; $mode = "blended" if not defined $mode; return '$str"; } ### 普通の amazon アソシエイトリンクの作成 # usage: {{amazon_link('ASIN', 'ID', 'STR')}} sub amazon_link { my ($asin, $id, $str) = @_; my $prefix = "http://www.amazon.co.jp/exec/obidos/ASIN"; $str =~ s/(\s|^)(\S+\.(jpg|jpeg|png|gif))/$1/gi; $str =~ s/$/
/gm; $str =~ s/
\Z//m; return qq($str); } ### 後ろめたい amazon アソシエイトリンクの作成 # ref. http://chalow.net/2003-11-06-2.html # usage: {{qualmish_amazon_link('ASIN', 'ID', 'STR')}} sub qualmish_amazon_link { my ($asin, $id, $str) = @_; my $prefix = "http://www.amazon.co.jp/exec/obidos/ASIN"; $str =~ s/(\s|^)(\S+\.(jpg|jpeg|png|gif))/$1/gi; $str =~ s/$/
/gm; $str =~ s/
\Z//m; return qq($str); } ### URL を短く表示 # usage: {{shorten_url('http://example.com/abc/def/00101033/ # 0123456/aaaaaaaaaaaa/aaaaaaaaaaaa/index.html')}} sub shorten_url { my ($url, $max) = @_; $max = 60 if not defined $max; $url =~ s/\s+//gsm; my $urlstr = $url; $urlstr =~ s/^(.{$max}).+$/$1 .../; return qq($urlstr); } ### カテゴリページへのリンク # usage: {{cat('プログラミング')}} sub cat { my ($cn) = @_; my $url = get_category_filename($cn); return qq($cn); } chalow-1.0/cl2moneycsv.pl0000755000076600007660000000473107712224544013673 0ustar ytoyto#!/usr/bin/env perl # $Id: cl2moneycsv.pl,v 1.1 2003/07/31 14:36:20 yto Exp $ # ChangeLog メモで家計簿! # ref. # # ■フォーマット # * .+?買物ログ: # ^\t[費目][スペース][コメント][金額]$ # - スペースは半角でも全角でも良い。 # - 金額は半角数字。桁カンマは入れてはいけない。 # # ■注意 # - 日本語コードは EUC を仮定 # - Excel に読み込ませる前に文字コードを Shift-JIS に変換する必要あり # # ■記述例&実行例 # # $ cat ChangeLog # 2003-08-02 YAMASHITA Tatsuo # # * できごと: だらだらしてた。 # # * p:買物ログ: # 食 スーパー 1050 # 本 コンビニで雑誌 380 # # 2003-08-01 YAMASHITA Tatsuo # # * できごと: 川崎で映画。 # # * p:買物ログ: # 外 ファーストフード 525 # 遊 映画 2000 # 交 川崎往復 420 # 食 スーパー 780 # # 2003-07-31 YAMASHITA Tatsuo # # * できごと: 渋谷に出掛けた。 # # * p:買物ログ: # 外 レストラン 3000 # 交 渋谷往復 640 # 雑 ペンとメモ帳 550 # # $ cl2moneycsv.pl ChangeLog # , 外, 食, 交, 遊, 本, 音, 雑, 衣, 他 # 2003.07.31,3000, 0, 640, 0, 0, 0, 550, 0, 0 # 2003.08.01, 525, 780, 420,2000, 0, 0, 0, 0, 0 # 2003.08.02, 0,1050, 0, 0, 380, 0, 0, 0, 0 # $ cl2moneycsv.pl -m ChangeLog (←月毎に集計) # , 外, 食, 交, 遊, 本, 音, 雑, 衣, 他 # 2003-07,3000, 0, 640, 0, 0, 0, 550, 0, 0 # 2003-08, 525,1830, 420,2000, 380, 0, 0, 0, 0 # $ cl2moneycsv.pl -m ChangeLog | nkf -s > kaimono.csv use strict; ### コマンドライン引数 use Getopt::Long; Getopt::Long::Configure('bundling'); my ($mon_mode); GetOptions('m|monthly' => \$mon_mode); # 費目 an item of expendidure my @lioe = ('外', '食', '交', '遊', '本', '音', '雑', '衣', '他'); my $date; my $inside_flag = 0; my %entry = (); while (<>) { if (/^((\d{4}-\d\d)-\d\d)/) { # 日付をキープ if (defined $mon_mode) { $date = $2; # = year-month } else { $date = $1; # = year-month-day $date =~ s|-|.|g; # for Excel } next; } elsif (/買物ログ:/) { # 家計簿データ記述ブロックの始まり $inside_flag = 1; } elsif ($inside_flag == 1) { # ブロック内 if (/^\s*$/ and $inside_flag == 1) { # ブロックの終わり $inside_flag = 0; } elsif (/^\t(.+?)(\s|\xa1\xa1).*(\s|\xa1\xa1)(\d+)$/) { $entry{$date}->{$1} += $4; } } } print " " x 10, ", ", join(', ', @lioe), "\n"; foreach my $date (sort keys %entry) { print "$date,"; print join(',', map {sprintf "%4d", $entry{$date}{$_}} @lioe), "\n"; } chalow-1.0/clkeitai.cgi0000755000076600007660000000723410060072116013326 0ustar ytoyto#!/usr/bin/env perl # $Id: clkeitai.cgi,v 1.4 2004/06/04 13:08:30 yto Exp $ # clkeitai.cgi - chalow により HTML 化されたページをケータイで見る # アイテム一覧表示 - アンカーなどはなし。アイテム別表示へのジャンプ用。 # アイテム別表示 - アンカーあり use strict; use Jcode; use CGI; my $q = new CGI; # 携帯電話で表示できる最大バイト # たぶん、3k だと思うが、いろいろあるので余裕を見るのがよいかと。 my $page_size_max = 2500; print "Content-type: text/html; charset=Shift_JIS\n\n"; print qq(CHALOW Keitai ); if (defined $q->param('date')) { my $date = $q->param('date'); if ($date =~ /^\d{4}-\d\d-\d\d$/) { # アイテムじゃなくてエントリを指定してきたときに対処 print "Candidates: \n"; for (my $i = 1; $i < 10; $i++) { print qq($date-$i, ); } print "...\n"; exit; } output_an_item($date); } else { my $from = $q->param('from') || 1; output_simple_list($from); } ### アイテム別表示 sub output_an_item { my ($ymdi) = @_; my ($ymd, $ym) = ($ymdi =~ /^((\d{4}-\d\d)-\d\d)/); my $fn; if (-e "$ymd.html") { $fn = "$ymd.html"; } elsif (-e "$ym.html") { $fn = "$ym.html"; } else { print "No Entry $ymdi\n"; } open(F, "< $fn") or die "Can't open $fn : $!\n"; binmode(F); my $all = join('', ); close(F); my $outstr = "no match"; while ($all =~ m|start:$ymdi -->(.*?)||gsm; $new =~ s|
.*?
||gsm; # 記述者名除去 $new =~ s|||gsm; $new =~ s|||gsm; $new =~ s|||gsm; $new =~ s|||gsm; $new =~ s|(.+?)|$1|g; # ヘッダのを除去 $new =~ s|\[(.+?)\]|[$1]|g; # カテゴリのを除去 # img の処理 $new =~ s|()()()|$1<>$3 $2 |gsm; $new =~ s|| qq([$3($2)])|exg; # inside ref $new =~ s|| qq()|gxe; $new =~ s!^(<.+?>|)\t!$1!gsm; # 行頭のタブは絶体除去 $outstr = $new; last; } if (length($outstr) > $page_size_max) { $outstr = substr($outstr, 0, $page_size_max); $outstr =~ s|<[^>]*$||; $outstr =~ s|([\x00-\x7f]([\x80-\xff]{2})*)[\x80-\xff]$|$1|; $outstr .= "\n\n[長いので以降省略しました]\n"; } $outstr = jcode($outstr)->sjis; print "$ymdi

$outstr

\n"; } ### アイテム一覧表示 # anchor とかなし。文字列だけ。アイテム別表示へのリンクあり。 sub output_simple_list { my ($from) = @_; my $outstr = ""; my $len = 0; my $last = 0; my $fn = "cl.itemlist"; open(F, "< $fn") or die "Can't open $fn : $!\n"; binmode(F); while () { # print "$from $.\n"; if ($from <= $.) { my ($d, $c) = (/^(.+?)\t(.+)$/); $d =~ s|^.*?\[(\d{4}-\d\d-\d\d-\d+)\].*?$| qq(
$1)|ex; #$d =~ s/<.+?>//g; $c =~ s/<.+?>//g; my $URLCHARS = "[-_.!~*'a-zA-Z0-9;/?:@&=+,%\#\$]"; my $URLDELIM = "\\\\\\n[\\t ]+"; $c =~ s{(s?https?|ftp)://($URLCHARS+)}{$1://...}gm; my $new = "$d
$c
\n"; if (length($new) > $page_size_max) { # a item > max $new =~ s/
.*$/
(大きすぎなので非表示)
\n/; } if ($len + length($new) > $page_size_max) { $last = $.; last; } $len += length($new); $outstr .= $new; } } close(F); $outstr = jcode($outstr)->sjis; print << "HTML" $outstr << HTML ; } chalow-1.0/clsearch.cgi0000755000076600007660000001405110706126215013327 0ustar ytoyto#!/usr/bin/perl # $Id: clsearch.cgi,v 1.1 2007-10-19 22:08:03+09 tatsuoyamashita Exp tatsuoyamashita $ # clsearch.cgi - chalow により HTML 化された ChangeLog を検索する CGI use strict; ### User Setting from here # お好みにあわせて変えて下さい my $numnum = 10; # 一度に表示できる数 my $css_file = "diary.css"; # for simple mode my $simple_template = << "_TEMPLATE"
%%CNT%%. %%DATE%% %%CONT%%
_TEMPLATE ; # for item mode my $item_template = << "_TEMPLATE" %%CONT%% _TEMPLATE ; # for list mode my $list_template = << "_TEMPLATE" %%DATE%% %%CONT%%
_TEMPLATE ; # simple mode でマッチした文字列をはさむタグ my ($open_tag, $close_tag) = (qq(), ""); ### to here use CGI; my $q = new CGI; my $myself = $q->url(); # このCGIのURL my $key = $q->param('key'); my $from = $q->param('from') || 0; my $clen = $q->param('context_length') || 200; my $mode = $q->param('mode'); # 0:simple mode, 1:item mode, 2:list mode if (defined $q->param('date')) { $mode = 2; $key = "date:".$q->param('date'); } if ($mode == 2) { # リストモードのときは全部一気に出す $numnum = 100000000; $from = 0; } if (defined $q->param('cat')) { $mode = 1; $key = "cat:".$q->param('cat'); $key =~ s/^(.+)$/"$1"/ if ($key =~ / /); } # ■■■ HTML head 出力 ■■■ print "Content-type: text/html; charset=euc-jp\n\n"; # ■■■ 検索 ■■■ my $outstr = ""; my $cnt = 0; sub clean { local ($_) = @_; # s/^"(.+)"$/$1/; s/(.)/'\x'.unpack("H2", $1)/gie; return $_; } if (defined $key and $key !~ /^\s*$/) { $key =~ s/\xa1\xa1/ /g; # ad hoc $key =~ s/\s+$//; $key =~ s/^\s+//; my @keys = ($key =~ /(".+?"|\S+)/g); # @keys = map {s/^"(.+)"$/$1/; s/(.)/'\x'.unpack("H2", $1)/gie; $_;} @keys; @keys = map {s/^"(.+)"$/$1/; $_;} @keys; my $fn = "cl.itemlist"; open(F, "< $fn") or die "Can't open $fn : $!\n"; binmode(F); while () { my ($date, $c) = (/^(.+?)\t(.+)$/); my @regular_keys; my $match_num = 0; foreach my $k (@keys) { # 毎回やるのは無駄。あとで直すべし。 if ($k =~ /^date:(.+)$/) { my $tmp = clean($1); $match_num++ if ($date =~ /\[$tmp/); } elsif ($k =~ /^cat:(.+)$/) { my $tmp = clean($1); $match_num++ if ($c =~ /^.+\[$tmp\].*\t.*$/); } else { my $tmp = clean($k); $match_num++ if ($c =~ m|$tmp|i); push @regular_keys, $tmp; } } my $pkey = $regular_keys[0] if (@regular_keys > 0); # 代表キー #print @keys,"
\n"; if ($match_num == @keys) { # if ($c =~ m|$pkey|i) { $cnt++; #next if ($cnt < $from + 1);last if ($cnt >= $from + 1 + $numnum); next if ($cnt < $from + 1 or $cnt >= $from + 1 + $numnum); # ↑高速化の余地 my $tmp_tmpl = $simple_template; if ($mode == 0) { # シンプルモード if (defined $pkey and $c =~ m|^.*?(.{0,$clen})($pkey)(.{0,$clen}).*?$|i) { my ($pre, $k, $pos) = ($1, $2, $3); # 80-ff が奇数だったら 1 バイト削除 (要ブラッシュ up) $pre =~ s!^[\x80-\xff](([\x80-\xff]{2})*[\x00-\x7f])!$1!; $pre =~ s!^[\x80-\xff](([\x80-\xff]{2})*)$!$1!; $pos =~ s!^(.*?[\x00-\x7f]([\x80-\xff]{2})*?)[\x80-\xff]$!$1!; $pos =~ s!^(([\x80-\xff]{2})*?)[\x80-\xff]$!$1!; $c = qq($pre$k$pos); my $p = join('|', @regular_keys); $c =~ s!($p)!$open_tag$1$close_tag!gi; } } elsif ($mode == 1) { # アイテムモード my ($file, $id) = ($date =~ /href="(.*?.html).*?">\[(.+?)\]/); $c = get_item($file, $id); $tmp_tmpl = $item_template; } elsif ($mode == 2) { # リストモード $c =~ s/\t.*$//; $tmp_tmpl = $list_template; } $tmp_tmpl =~ s/%%CNT%%/$cnt/g; $tmp_tmpl =~ s/%%DATE%%/$date/g; $tmp_tmpl =~ s/%%CONT%%/$c/g; $outstr .= $tmp_tmpl; } } close(F); } # ■■■ 過去記事表示のための選択棒 ■■■ my $page_max = int(($cnt - 1) / $numnum); my ($qkey) = ($q->query_string =~ /(key=[^&]+)/); ($qkey) = ($q->query_string =~ /(cat=[^&]+)/) if ($qkey eq ""); my $bar = ""; my ($navip, $navin); if ($page_max != 0) { # 1ページのみのときは選択棒なし for (my $i = 0; $i <= $page_max; $i++) { if ($from / $numnum == $i) { $bar .= "".($i + 1).''; } else { $bar .= $q->a({-href => "$myself?from=".($i * $numnum)."&".$qkey}, $i + 1); } $bar .= " "; if ($from / $numnum == $i - 1) { $navin = $q->a({-href => "$myself?from=".($i * $numnum). "&".$qkey}, "[ 次へ ]"); } elsif ($from / $numnum == $i + 1) { $navip = $q->a({-href => "$myself?from=".($i * $numnum). "&".$qkey}, "[ 前へ ]"); } } } if ($cnt == 0) { print "

見つかりませんでした。

\n"; } else { print "

$cnt 件 見つかりました。

\n"; } my $page_template = << "__TEMPLE" CHALOW Search ChangeLog INDEX

$navip $bar $navin

$outstr

$navip $bar $navin

ChangeLog INDEX
Powered by chalow
__TEMPLE ; #print $q->Dump(); print $page_template; exit; ### ファイルから、IDにより指定されたitemを取りだす my %file_cache; sub get_item { my ($file, $id) = @_; my $all; if (not defined $file_cache{$file}) { open(F2, $file) or die "can't open $file : $!"; $file_cache{$file} = join('', ); close F2; } my $start = ""; my $end = ""; my ($item) = ($file_cache{$file} =~ /($start.+$end)/sm); return $item; } chalow-1.0/clweek.pl0000755000076600007660000000200507612131605012663 0ustar ytoyto#!/usr/bin/env perl # $Id: clweek.pl,v 1.1 2003/01/18 01:53:09 yto Exp $ # usage: prog ChangeLogFileName > NewFileName # before: 2000-06-12 YAM Tat # before: Mon Jun 12 08:05:49 2000 YAM Tat # after: 2000-06-12 (Mon) YAM Tat use POSIX; use Time::Local; setlocale(LC_TIME, "C"); my %mon; for ($i = 0; $i < 12; $i++) { $mon{('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')[$i]} = $i + 1; } while (<>) { # for 2000-06-12 YAM Tat s/^(\d{4})-(\d\d)-(\d\d)\s\s/ sprintf "%04d-%02d-%02d (%s) ", $1, $2, $3, get_weekday_name($1, $2, $3)/ex; # for Mon Jun 12 08:05:49 2000 YAM Tat s/^([A-Z]..)\s([A-Z]..)\s+(\d+).+(\d{4})/ sprintf "%04d-%02d-%02d (%s)", $4, $mon{$2}, $3, get_weekday_name($4, $mon{$2}, $3)/ex; print; } sub get_weekday_name { ($y, $m, $d) = @_; return strftime "%a", localtime timelocal(0, 0, 0, $d, $m - 1, $y); } chalow-1.0/conf/0000755000076600007660000000000010706123230011772 5ustar ytoytochalow-1.0/conf/utf8/0000755000076600007660000000000010706123235012665 5ustar ytoytochalow-1.0/conf/utf8/cl.conf0000644000076600007660000004142610706122667014151 0ustar ytoyto# -*- perl -*- ### 若区┃絎 ### # -------------------------------------------------------------------- # ヨ $changelog_name = "ChangeLog"; # -------------------------------------------------------------------- # ChangeLog URL (腟九 URL 綣激ィ絅) - RSS 綽荀 # 箴: $clog_url = "http://chalow.net/"; $clog_url = "."; # 綽 URL 荐絎筝 # -------------------------------------------------------------------- # ゃ潟鴻若 (index.html) ф菴篏ュ茵腓冴 # (潟潟ゃ潟激с "-n" с絎с障) $opt_topn = 7; # -------------------------------------------------------------------- # ャ若吾篏 (0:NO, 1:YES) --- obsolete #$day_page_mode = 1; # -------------------------------------------------------------------- # 篏若吾篏 (0:, 1:, 2:≪ゃ) $page_mode = 2; # -------------------------------------------------------------------- # 絖臀 $auto_replace = ' s!(
)!

$1!g; s!(
)!$1

!g; s!(chalow)(<|\s|[\x80-\xff]|$)!$1$2!g; '; # -------------------------------------------------------------------- # <ゃ冴臀絖 $replace_once = << "__REPLACE_ONCE" __REPLACE_ONCE ; # -------------------------------------------------------------------- # CSS <ゃ $css_file = "diary.css"; #$css_file = "clover/clover.css"; # -------------------------------------------------------------------- # RSS<ゃ $rss_filename = "cl.rdf"; # -------------------------------------------------------------------- # RSS菴篏ュ茵腓冴(0翫 $opt_topn ) $rss_topn = 0; # -------------------------------------------------------------------- # ヤ緇(Mon, Tue, ...)茵腓冴 (1:yes or 0:no) $show_day_of_week = 1; # -------------------------------------------------------------------- # 若吾сヤ (違ヤ筝) ц;腓冴 (1:yes or 0:no) $reverse_order_days = 1; # -------------------------------------------------------------------- # ≪ゃ若若 # (0:"* HOGE:", 1:"* HOGE", 2:"HOGE:",3:"HOGE") $item_header_style = 1; # -------------------------------------------------------------------- # 茵腓冴綣荐 ('>' or '|') 羔 (1:YES, 0:NO) $remove_quote_mark = 1; # -------------------------------------------------------------------- # item header h3 帥違篏帥 (1:YES, 0:NO) - tDiary 篋с $use_h3_for_item_header = 1; # -------------------------------------------------------------------- # item header 荐垩≪潟若ゃ (1:YES, 0:NO) $use_item_anchor = 1; # -------------------------------------------------------------------- # item header 荐垩絎 # ヨ祉激с潟(泣帥ゃ茵)水ャ潟 # ≪潟惹絖絎障_ # 絎若c糸≪潟若ゃ # (tDiary skel/conf.rhtml ) $item_header_mark = qq(); # -------------------------------------------------------------------- # RSS 阪 (1:YES, 0:NO) $output_rss = 1; # -------------------------------------------------------------------- # ヨ茯 for RSS : 箴: "ャ" $changelog_description = "ャ"; # -------------------------------------------------------------------- # 篁綛眼ヤ () 吾潟綣泣 (1:YES, 0:NO) $same_date_jump = 1; # -------------------------------------------------------------------- # ヤ筝荀с潟取;腓冴 (1:YES, 0:NO) $calendar_style = 0; # -------------------------------------------------------------------- # 罎膣∝<ゃ (cl.itemlist) 篏 (1:YES, 0:NO) $output_itemlist = 1; # -------------------------------------------------------------------- # 荀冴筝荀 (JavaScript <ゃ) у阪ユ $latest_titles_num = 10; # -------------------------------------------------------------------- # 眼若吾篏 (0:NO, 1:YES) $output_cat_pages = 0; # -------------------------------------------------------------------- # 眼若娯賢潟違筝 # ($output_cat_pages = 1 炊) $cat_page_entry_max = 20; # -------------------------------------------------------------------- # 眼item茵腓冴CGI絎鐚眼 %%CAT%% х舟鐚 # ($output_cat_pages = 0 炊) $cat_page_cgi = "clsearch.cgi?cat=%%CAT%%"; #$cat_page_cgi = ""; ###################################################################### ## 潟若 # (泣ゃ<ャ若泣ゃ) my $side_menu = << "___SIDE_MENU"

ChangeLog罎膣

菴荅演

___SIDE_MENU ; # ゃ潟鴻若吾潟若 $index_page_template = << "___INDEX_PAGE_TEMPLATE" <TMPL_VAR name=cl_name>

/ RSS

/

ュ / 篁筝荀

腟贋井:

___INDEX_PAGE_TEMPLATE ; # 若吾潟若 $month_page_template = << "___MONTH_PAGE_TEMPLATE" <TMPL_VAR name=cl_name> / <TMPL_VAR name=ym>

/ 罨< /

/

腟贋井:

___MONTH_PAGE_TEMPLATE ; # ャ若吾潟若 $day_page_template = << "___DAY_PAGE_TEMPLATE" <TMPL_VAR name=cl_name> / <TMPL_VAR name=ymd>

/ 罨< / /

/

腟贋井:

___DAY_PAGE_TEMPLATE ; # ≪ゃ若吾潟若 $item_page_template = << "___PAGE_TEMPLATE" <TMPL_VAR name=header_text> Prev / Next /

Referrer (Inside):

permlink

___PAGE_TEMPLATE ; # ≪ゃ若吾潟若 #$item_page_template = << "___PAGE_TEMPLATE" # 眼若吾潟若 $cat_page_template = << "TMPL" <TMPL_VAR name=cat_name> / <TMPL_VAR name=cl_name> ChangeLog 違若 / 眼違若 / 罨<若 / page ()

-

腟贋井:

TMPL ; # item 潟若 $item_template = << "EACHITEM"

[ Read More... ]

Referrer (Inside):
[ 阪潟 ]
EACHITEM ; # entry (date) 潟若 $entry_template = << "DAYENTRY"

Referrer (Inside):
DAYENTRY ; ###################################################################### ## 違ゃ ### 潟<潟≪ # usage: {{com(' HTML 紊障')}} sub com { } ### clsearch 若若罎膣 URL 篏 # usage: {{clsearch('羌決 脂え')}} # usage: {{clsearch('羌決 脂え', 1)}} sub clsearch { my ($k, $mode) = @_; my $o = $k; $k =~ s/([^0-9a-z_ ])/'%'.unpack('H2', $1)/gei; $k =~ s/\s/+/g; $mode = "&mode=$mode" if (defined $mode); return qq($o); } ### google 若若罎膣 URL 篏 # usage: {{google_search('羌決 脂え')}} sub google_search { my ($k) = @_; my $o = $k; $k =~ s/([^0-9a-z_ ])/'%'.unpack('H2', $1)/gei; $k =~ s/\s/+/g; my $c = "ie=EUC-JP&oe=EUC-JP&"; return qq($o); } ### Bulkfeeds 若若罎膣 # usage: {{bulkfeeds('羌決 ')}} sub bulkfeeds { my ($k) = @_; my $o = $k; $k = Jcode->new($k)->utf8; $k =~ s/([^0-9a-z_ ])/'%'.unpack('H2', $1)/gei; $k =~ s/\s/+/g; return qq($o); } ### amazon 潟篏 # usage: {{amazon('ASIN', 'STR')}} sub amazon { my ($asin, $str) = @_; my $prefix = "http://www.amazon.co.jp/exec/obidos/ASIN"; # my $suffix = ""; my $suffix = "ytoshomepage-22/ref=nosim"; # ≪純ID篏睡 $str =~ s/(\s|^)(\S+\.(jpg|jpeg|png|gif))/$1/gi; $str =~ s/$/
/gm; $str =~ s/
\Z//m; return qq($str); } sub az {amazon(@_)} sub azs {amazon_search(@_)} sub bf {bulkfeeds(@_)} sub cls {clsearch(@_)} sub gs {google_search(@_)} ### amazon 泣若腟潟篏 # usage: {{amazon_search('STR' [,'MODE'])}} sub amazon_search { my ($str, $mode) = @_; my $k = Jcode->new($str)->utf8; $k =~ s/([^0-9a-z_ ])/'%'.unpack('H2', $1)/gei; $k =~ s/\s/+/g; my $aid = "ytoshomepage-22"; $mode = "blended" if not defined $mode; return '$str"; } ### amazon ≪純激ゃ潟篏 # usage: {{amazon_link('ASIN', 'ID', 'STR')}} sub amazon_link { my ($asin, $id, $str) = @_; my $prefix = "http://www.amazon.co.jp/exec/obidos/ASIN"; $str =~ s/(\s|^)(\S+\.(jpg|jpeg|png|gif))/$1/gi; $str =~ s/$/
/gm; $str =~ s/
\Z//m; return qq($str); } ### URL 頫腓 # usage: {{shorten_url('http://example.com/abc/def/00101033/ # 0123456/aaaaaaaaaaaa/aaaaaaaaaaaa/index.html')}} sub shorten_url { my ($url, $max) = @_; $max = 60 if not defined $max; $url =~ s/\s+//gsm; my $urlstr = $url; $urlstr =~ s/^(.{$max}).+$/$1 .../; return qq($urlstr); } ### 眼若吾吾潟 # usage: {{cat('違潟')}} sub cat { my ($cn) = @_; my $url = get_category_filename($cn); return qq($cn); } chalow-1.0/README0000644000076600007660000002573410706126173011751 0ustar ytoytochalow - CHAngeLog On the Web - convert ChangeLog to HTML files ChangeLog $B$r(B HTML $B$KJQ49$9$k%D!<%k(B README $Id: README,v 1.1 2007-10-19 22:07:48+09 tatsuoyamashita Exp tatsuoyamashita $ ---------------------------------------------------------------------- $B%$%s%9%H!<%k(B ---------------------------------------------------------------------- chalow$B<+BN$N%$%s%9%H!<%k$OITMW$G$9$,!"0J2<$N(BPerl$B%b%8%e!<%k$,I,MW$G$9!#(B CPAN$B$+$iF~$O!"(B"$BG/(B-$B7n(B.html" $B$H$$$&%U%)!<(B $B%^%C%H!#$=$N7n$NA45-=R$,4^$^$l$k$Z!<%8!#(B $BF|%Z!<%8$H$O!"(B"$BG/(B-$B7n(B-$BF|(B.html" $B$H$$$&%U%!%$%kL>$G=PNO$5$l$k!"0lF|$4$H$N(B $BFbMF$N%Z!<%8!#%*%W%7%g%s$GF|%Z!<%8$r=PNO$9$k$h$&$KA*Br$G$-$k!#(B $B=PNO@h%G%#%l%/%H%j$H$O!"(BChangeLog $B$+$iJQ49$5$l$?(B HTML $B%U%!%$%k$,=PNO$5(B $B$l$k@h!#%G%U%)%k%H$G$O8=:_$N%G%#%l%/%H%j!#(B ---------------------------------------------------------------------- $B;H$$J}(B ---------------------------------------------------------------------- usage: chalow [options] [file]... -n, --top-n=NUM write NUM days to "index.html" -o, --output-dir=DIR directory to output -c, --configure-file=FILE configure file (default "cl.conf") -s, --stop-date date to stop processing -u, --update-by-size overwrite only if sizes are different -C, --css=FILE css file -8, --utf8 utf8 mode -q, --quiet quiet mode -n $B$G!"!V%$%s%G%C%/%9%Z!<%8!W$K:G6a$N2?F|J,$r:\$;$k$+;XDj$G$-$k!#(B -o $B$G!"!V=PNO@h%G%#%l%/%H%j!W$r;XDj$9$k!#B8:_$7$J$$%G%#%l%/%H%j$r;XDj(B $B$7$F$O$$$1$J$$!#(B -c $B$G!"!V%f!<%6@_Dj%U%!%$%k!W$r;XDj$9$k!#;XDj$7$J$$$H%G%U%)%k%H$N@_Dj!#(B -s $B$G!"=hM}Dd;_F|IU(B ($stop_date) $B$r;XDj$9$k!#$3$NF|IU$^$G=hM}$9$k!#(B $BL$;XDj$J$i:G8e$^$G=hM}$9$k!#(B ($BNc(B: --stop-date "2002-01-01") -C $B$G!"(Bchalow: CSS $B%U%!%$%k$r%3%^%s%I%i%$%s$+$i;XDj$G$-$k!#(B -u $B$r;XDj$9$k$H!"=PNO@h%U%!%$%k$H%5%$%:$,0[$J$k>l9g$N$_>e=q$-=PNO$9$k!#(B -8 $B$r;XDj$9$k$H!"(BUTF8$B$G$N=PNO$K$J$k!#(BChangeLog, cl.conf $B$O(BUTF8$B$r2>Dj!#(B -q $B$r;XDj$9$k$H!"JQ49:n6H?JD=>pJs$rI8=`=PNO$K=PNO$7$J$/$J$k!#(B $B\:Y$O!"E:IU$5$l$F$$$k(B cl.conf ($B%5%s%W%k(B) $B$r;2>H$5$l$?$$!#(B - $BF|5-$NL>A0!"(BURL - $B%$%s%G%C%/%9%Z!<%8(B (index.html) $B$G:G6a2?F|J,$rI=<($9$k$+(B - $B%$%s%G%C%/%9%Z!<%8$N%F%s%W%l!<%H(B ($B"((B5) - $B7n%Z!<%8$N%F%s%W%l!<%H(B ($B"((B5) - $B<+F0J8;zNsCV49(B ($B"((B6) - CSS $B%U%!%$%k(B - $B7n%Z!<%8$KI=<($9$kF|IU$N=gHV(B ($B9_=g(B or $B>:=g(B) $B$ND4@0(B - $B%?%V$K$h$k%$%s%G%s%H$r$J$/$9$+(B - $B%"%$%F%`%X%C%@!<$N%U%)!<%^%C%H$r$I$&$9$k$+(B - $BI=<($9$k$H$-0zMQ5-9f(B ('>' or '|') $B$r>C$9$+(B - item header $B$K(B h3 $B%?%0$rB-$9$+(B ($B"((B7) - item header $B$N@hF,$N(B "*" $B$K%"%s%+!<$r$D$1$k$+(B - $BF|%Z!<%8(B (2003-10-01.html $BEy(B) $B$r=PNO$9$k$+(B - RSS $B%U%!%$%k$r=PNO$9$k$+(B - ... $B"((B5 $B%$%s%G%C%/%9%Z!<%8$H7n%Z!<%8$N(B HTML $B%F%s%W%l!<%H$O(B $index_page_template, $month_page_template $B$G@_Dj$9$k!#>\$7$/$O(B cl.conf $B$N%3%a%s%H$r;2>H$5$l$?$$!#(B $B"((B6 $B!V<+F0J8;zNsCV49!W$O!"(BChangeLog $BCf$NJ8;zNs$rG$0U$NJ8;zNs$KJQ49$7$F(B $B$$$H$-$KMQ$$$k!#MW$9$k$K(B perl $B$N%W%m%0%i%`$r=q$$$F$*$/$H(B HTML $B$X$NJQ49(B $B$N$H$-$KE,MQ$7$F$/$l$k$H$$$&$o$1!#(B $BNc(B: "NAISTO" $B$r(B "NAISTO" $B$K!"(B "google" $B$r(B "google" $B$KJQ49$9$k!#(B $auto_replace = ' s!(NAISTO)!$1!g; s!(\sgoogle\s)!$1!g; '; $B"((B7 tDiary $B$N%F!<%^(B (CSS $B%U%!%$%k(B) $B$r$=$N$^$^;H$&$?$a$KI,MW!#(B tDiary $B$N%F!<%^$r;H$&$K$O0J2<$N$h$&$J@_Dj$r9T$&$HNI$$!#(B - $item_header_style = 1 or 2 ($B%$%a!<%8%"%s%+!<$r;H$&$H$-(B) - $use_h3_for_item_header = 1 - $css_file = "tDiary$B$N%F!<%^$N(BCSS$B%U%!%$%k(B.css" - $item_template $B$G(B h3 $B$G(B header $B$r0O$`!#(B ---------------------------------------------------------------------- ChangeLog $B$NFCH%j%s%/(B: "[YYYY-MM-DD]" $B$H$$$&J8;zNs$O!"<+F0E*$K2a5n$N9`L\(B $B$X$N;2>H%j%s%/$XJQ49$5$l$k!#(B"[YYYY-MM-DD-I]" $B$H$$$&Iw$K%"%$%F%`(B No. $B$b;XDj$G$-$k!#(B $B@hF|(B[2001-12-01]$B!"$I$3$+$X9T$C$?!#(B $B"-(B $B@hF|(B[2001-12-01]$B!"(B $B$I$3$+$X9T$C$?!#(B - $BG$0U$N(B URL $B$X$N%j%s%/(B $B!VC18l(B|URL$B!W$r(B 2 $B$D$NH>3Q%+%.%+%C%3$G0O$`$H$rG$0U$N(B URL $B$X$N%j%s%/(B $B$K$J$j$^$9!#Nc!'(B [[Yahoo!|http://www.yahoo.co.jp/]] $B$3$N$H$-(B URL $B$NKvHx$,(B jpg,jpeg,png,gif $B$@$H(B IMG $B%?%0$KE83+$5$l$^$9!#(B $B!J;XDj$7$?C18l$,(BALT$B$K@_Dj$5$l$k!K!#Nc!'(B [[$B?^(B|image/gazou.png]] $B!VC18l!W$NKvHx$,(B jpg,jpeg,png,gif $B$@$H%/%j%C%/2DG=$J(B IMG $B%?%0$KE8(B $B3+$5$l$^$9!#(BIMG $B$,(B URL $B$X$N%j%s%/$K$J$j$^$9!#Nc!'(B [[image/gazou.png|http://nais.to/~yto/]] $B$^$?!"(BURL $B$C$]$$$b$N$,$"$k$H>!" $B$,Mh$k9T$O0zMQ$H$_$J$7!"(B blockquote $B$G0O$^$l$k!#(B > $B0zMQ(B > $B0zMQ(B > $B0zMQ(B > $B$3$l$O0zMQ$G$O$J$$(B | $B0zMQ(B | $B0zMQ(B | $B$3$l$O0zMQ$G$O$J$$(B $B$^$?$O!"(B">>" $B$H(B "<<" $B$G0O$^$l$?NN0h$,(B blockquote $B$G0O$^$l$k!#(B >> $B0zMQ(B $B0zMQ(B $B0zMQ(B << - $BJ8;z=$>~$N5-K!(B $B!V(B'$B!W(B2$B8D$G$O$5$s$@ItJ,$O6/D4$5$l$^$9!#!V(B'$B!W(B3$B8D$G$O$5$s$@ItJ,$O$5$i(B $B$K6/D4$5$l$^$9!#!V(B=$B!W(B2$B8D$G$O$5$s$@ItJ,$OC@~$K$J$j$^$9!#Nc!'(B ==ABC== ''ABC'' '''ABC''' - $B?eJ?@~$N5-K!(B $B%^%$%J%95-9f!V(B-$B!W$r9T$N@hF,$N%?%V$N8e$+$i(B 4 $B$D=q$/$H?eJ?@~$K$J$j$^(B $B$9!#Nc!'(B $B$"$O$O(B ---- $B$$$R$R(B - $BI=(B(table)$B$N5-K!(B $B0J2<$N$h$&$K5-=R$7$^$9!#(B ||$B9`L\(B1-1||$B9`L\(B1-2||$B9`L\(B1-3 ||$B9`L\(B2-1||$B9`L\(B2-2||$B9`L\(B2-3 - $B!VB3$-$rFI$`!W$NI=5-(B '====' $B$H5-=R$9$k$H!V(BRead More...$B!W$H$$$&%j%s%/$,$G$-(B item page $B$X(B $B%8%c%s%W$7$^$9!#(B item page $B$r=P$9$h$&$K$7$?$H$-(B($page_mode=2)$B$N$_5!G=$7$^$9!#(B - $B%W%i%0%$%s5!G=(B $B!V(B{{$B!W$H!V(B}}$B!W$G0O$`$H%W%i%0%$%s(B ($B4X?t(B) $B$r8F$S=P$9$3$H$,$G$-(B $B$^$9!#(B $BNc(B: {{google_seach('$B3$O7L>(B $B1G2h4[(B')}} $B%W%i%0%$%s$O(B cl.conf $B$KB-$7$FCV$1$P;H$($^$9!#(B - $B%+%F%4%j5!G=(B item header $B$G%+%F%4%j$r;XDj$9$k$H!"%+%F%4%jJL%Z!<%8$K=PNO$5$l$^$9!#(B $B%+%F%4%j$N;XDj$N;EJ}!'(B * $B%?%$%H%k(B [$B%+%F%4%jL>(B][$B%+%F%4%jL>(B][$B%+%F%4%jL>(B]...: ... $BNc!'(B * $B%&%R%g$N9XF~J}K!(B [KnowHow]: $B$^$:$O%3%s%S%K$X9T$C$F(B... * $B$&$^$$!*(B[$B$O!V(Bcat_[$B%+%F%4%jL>(B].html$B!W$N$h$&$K$J$j$^$9!#(B - $BF|!9$N%a%C%;!<%8Kd$a9~$_(B $BF|IU%(%s%H%j$N>e$H2<$K$=$NF|$N%a%C%;!<%8$rI=<($9$k$3$H$,$G$-$^$9!#(B $B0J2<$N$h$&$J(B item $B$r=q$-$^$9!#(B item $B$NCf$N(B HTML $B%?%0$O%(%9%1!<%W$5$l$^$;$s!#(B * message-top:

$BH~?)2H$NKv$O8p?)(B --- $B%Y%s%8%c%_%s!&%U%i%s%/%j%s(B

* message-bottom: $B"v(B Jeith Jarrett / La Scala - $B%(%9%1!<%W(B $B0J2<$N5-K!$G(BHTML$B$rD>=q$-$9$k$3$H$,$G$-$^$9!#(B [literal]...[/literal], [sic]...[/sic], [esc]...[/esc] - $B%=!<%9(B $B%=!<%9$NI=<($O(B [src]...[/src] $B$r;H$$$^$9!#(B $BFbIt$G$O%(%s%F%#%F%#CV49$H(Bpre$B0O$_$r9T$$$^$9!#(B - ChangeLog$B$NKvHx(B $B9TF,$,!V(B__DATA__$B!W$G;O$^$k9T$,$"$k$H!"$=$l0J9_$N5-=R$OL5;k$5$l$^$9!#(B $B%?%V$,F~$C$F$$$l$PBg>fIW$G$9!#(B ---------------------------------------------------------------------- $BCm0U(B ---------------------------------------------------------------------- ChengaLog $B%U%!%$%k$NF|IU9T$O!"0J2<$N%U%)!<%^%C%H$G$J$1$l$P$J$i$J$$!#(B 2001-11-21 YAMASHITA Tatsuo or 2001-11-21 (Wed) YAMASHITA Tatsuo $BMKF|F~$jF|IU%U%)!<%^%C%H$K$D$$$F$O!"(B $B$r;2>H$5$l$?$$!#(B $B0J2<$N%U%)!<%^%C%H$O%5%]!<%H$7$F$$$J$$!#(B Sat Mar 14 08:48:56 1998 YAMASHITA Tatsuo $B$7$+$7!"%Q%C%1!<%8$K4^$^$l$F$$$k(B clweek.pl $B$GF|IU%U%)!<%^%C(B $B%H$NJQ49$,$G$-$k!#(B $B;H$$J}(B: % ./clweek.pl ChangeLog > ChangeLog-new chalow-1.0/sample/0000755000076600007660000000000010302012167012324 5ustar ytoytochalow-1.0/sample/check-tr.png0000644000076600007660000000015307677577023014565 0ustar ytoytoPNG  IHDR l士PLTEUtRNS@聊fIDATxcI=LIENDB`chalow-1.0/sample/diary.css0000644000076600007660000001151410163003416014152 0ustar ytoyto/* Title: chalow default */ /* ページ全体の基本的な設定。背景色や文字色など */ body { background-color: White; } /* リンク文字列に関する設定 */ a:link { text-decoration: none; } a:visited { text-decoration: none; } /* ページトップ (とか、下) にある操作ボタンの並ぶ行の設定 */ .adminmenu { text-align: left; margin: 0em; font-size: small; } /* 日記タイトルの設定 */ h1 { text-align: left; border-color: #808080; border-style: solid; border-width: 1px 0 1px 0; padding: 0.5em; } /* 1日の日記全体を囲む枠の設定 (entry) */ div.day { padding: 5px 0px 5px 0px; margin: 5px 0px 5px 0px; } /* タイトル行全体の設定 (enrty header) */ h2 { margin: 0.0em 0.0em 0.5em 0.0em; padding: 0.5em 0.0em 0.5em 0.0em; border-color: #808080; border-style: solid; border-width: 1px 10px 1px 10px; background-color: #d0d0d0; } /* 日付の設定 (in enrty header) */ span.date { padding: 0em 0.5em 0em 0.5em; } /* タイトルを除いた1日の日記本文全体の設定 (items) */ div.body { padding: 0em; margin: 0em; } /* item header の設定 */ /* memo: tDiary だと h3。chalow でも設定によって h3 を出すことが可能 */ .clitemheader { color: #606060; font-weight: bold; padding: 3px 3px 0px 3px; } h3 { color: #606060; font-weight: bold; margin: 0px; } /* イメージアンカーの設定 */ /*div.day span.sanchor {*/ span.sanchor { /* background-image: url(dot-pink-16.png); background-position: bottom left; background-repeat: no-repeat; padding: 0px 0px 0px 0px; margin: 0px 0px 0px 0px; color: #fff; background-color: transparent; */ font-size: xx-small; } /* サブタイトルを含むセクション (item) の設定 */ div.section { border-color: #ffffff; border-style: solid; border-width: 1px; line-height: 130%; padding: 5px; margin: 5px 0px 15px 0px; } /* item 中の引用の設定 */ div.body blockquote { border-color: #808080; border-style: solid; border-width: 1px; background-color: #f0f0f0; font-size: small; line-height: 120%; margin: 3px; padding: 3px; } /* 各 item の pre の設定 (各 item は pre で囲まれている) */ div.body pre { font-family: monospace; white-space: pre; line-height: 100%; margin: 0; padding: 0; font-size: x-small; } div.body p { margin: 0; padding: 0; } /* カレンダーの設定 */ .calendar { background-color: #fff8ff; text-align: left; font-size: x-small; } .calendar table { } /* フッタの設定 (一番下の chalow のロゴ) */ .footer { text-align: right; font-size: x-small; margin: 0em; } p.footer a { font-weight: bold; } /* ツッコミ関連 */ div.comment { border-style: solid; border-color: #d0d0d0; border-width: 1px; margin: 0.5em; padding: 0.5em; font-size: small; background-color: #f0f0f0; } div.comment p { margin: 0.5em; } div.day span.canchor { /* background-image: url(dot-gray.png); background-position: bottom right; background-repeat: no-repeat; padding: 0px 16px 0px 0px; color: #fff; background-color: transparent; */ font-size: small; } div.form { border-style: solid; border-color: #d0d0d0; border-width: 1px; margin: 0.5em; padding: 0.5em; background-color: #f0f0f0; } div.commentshort { margin: 0.3em; } div.commentbody { } /* いろいろ */ img { margin: 2px; } /* .section a img { margin: 2px; border-style: solid; border-width: 1px; } */ /* for chalow: Referrer by 日付リンク */ div .referer { font-size: x-small; color: #808080; background-color: #f8f8f8; margin-top: 0.5em; padding: 0.2em; } div .referer a:link {color: #404040;} div .referer a:visited {color: #606060;} /* for chalow: author of item */ div .itemauthor { text-align: right; padding: 0.3em 0 0 0; } div .itemauthor span { font-size: small; border-color: #b0b0b0; border-style: solid; border-width: 0px 5px 1px 0px; color: #606060; } #content { position:relative; margin-left: 230px; /* margin-right: 180px;*/ padding: 0px; } #links { position:absolute; top:8.5em; left:5px; width: 225px; /* float: left; margin-right: 5px;*/ margin: 0px; padding: 0px; } #footer { clear: both; margin-top: 5px; } .stdbox table {width: 100%; margin: 0;} .stdbox a {text-decoration: none;} .stdbox td {border: solid 1px #808080; padding: 3px; font-size: x-small;line-height: 130%;} .stdbox ul {margin: 0; padding: 0} .stdbox li {margin: 0 0 0 1em} .stdbox dl {margin: 0;} .stdbox dd {margin: 0 0 0 1em; padding: 0;} .funcbox {border:solid 1px #808080;font-size:x-small;padding:3px;margin:2px; line-height: 120%; } .section table {border-collapse: collapse;} .section td {border: solid 1px gray; padding: 3px;} chalow-1.0/sample/dot-gray.png0000644000076600007660000000034607727630325014606 0ustar ytoytoPNG  IHDRdW$IDATxcxY@| 届_ Y 鶻 gj)o禰GtEXtSoftware@(#)ImageMagick 5.1.1 00/02/01 Q:8 cristy@mystic.es.dupont.comC2*tEXtSignatureee521f7cf25dd197fa98e07f247a0efa IENDB`chalow-1.0/sample/dot-pink-16.png0000755000076600007660000000075610046677620015036 0ustar ytoytoPNG  IHDRh6 pHYs  IDATx=Qn@D_7YA@@(d{m=單MFVT^|sg[叨Ff{z^ゥs記L E`朸乍HJKye\%r退 緑潸繼ixbサ肺cD3:Q>.瀁驥謾z渉\$R淪m*%I甘嗚C)IENDB`chalow-1.0/sample/dot-pink.png0000644000076600007660000000040707727630325014603 0ustar ytoytoPNG  IHDR6!8PLTE憑a冩;Iq& !IDATxc````d`RRf`tF']\1>oB,GtEXtSoftware@(#)ImageMagick 5.1.1 00/02/01 Q:8 cristy@mystic.es.dupont.comC2*tEXtSignature910f9096f83e2c23d7ef6cdbc87374b8沍ZIENDB`chalow-1.0/sample/image/0000755000076600007660000000000010302012167013406 5ustar ytoytochalow-1.0/sample/image/2001-11-20-23-19-44.s.jpg0000644000076600007660000002056407504770677016331 0ustar ytoytoJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222"?!1AQaq"2#3 ̄叢4BRbr$5St托&!1A"Q2#q ?E;E^Y,磐 OJH拾& 1qc8tS4pF坑$H9襾gE 3@ "*W$o AS^%;qC3mm4%毟8FNCd朿E}hPo4@!Mi<%娑EじIkGqt絡槝ro l 笵UsZ3KHU ' 7G析89苒1桃據WvyS-$戝ng&< _-V=H/!O6 y4'iE L`T唸^EF_~B守K黄Gtqknj`k88b桙q1羣棲*z!JNys`Ai毡UmRTnjpaQ:v]3v攴FZ5954傘M1 [f鶏$;EX d3\PY>v 1l:AMoLE-qQ@m]VqN  w=*悶Z練*1霓s2睨Q3油墻UF; :A7懾(鬥&TTA墺P唖1P:s 隣I"Cg;C=H$Ts&偽2K暖P跋ut;UU#[dRlvx&.z *.琶j9=*5襄LP"pF\5Q5楹V?!UgX蘿z霓恬[檀ぅt{,F5mL.9盡tl{a\Y) 0髻!u0匳燐E8`e2:TF乍>\uQ}謁_NbQ1GmC l煉 Va崗K%?忖Q v$>#rox澱s~5牽2z>*6!CTtAGA欣LRBi"!fk榿..#e贄GsCL格[〔jF3粕e# ;LvJ%^dHsG!P GF_xt~4醇径na$L5y#OiE靱G趣fk{6`Duiu朞!vfOH銘匸s6/JА > G}+u涵\q勿<略k|l ox[秉}EU 粛s5NdN|╂ 9lhィ sm*kmYcSC#%w9Wo轌mT=2hv臼bB=7t"yu%K=9Tg^ynT ul艙xp渥JezQ\蛮蟲8lz)< B傚環d_}c@z龕+F+ao9慨sr}~ib晧$Z{RN=刀D2Elt劇K陰'j\4kI(竍辧K*!T9p>T5S{ E$[)h{*D2(T!Pr_mXWJ BV}F3RcR{r"~衛GqD&*{8aW 7R敍#涼' 5呑 7[[<$l鴪/薛-`e?jcHRS4稔`jL3慵棔rX!r1録t(/QN-|霞ut.XUI`KyglR蔑)4栩Ef 食8&膠F KszdU#袵禪K@=WKm底LN功Ww93cQ'゙痼30"1タR~Ec:r0\|fユ!Qi笞U'箪ox7hYp#)j 燃98dW=a埜cZ]$噐F+鬆$FlFPA$snlj枦oB入}0GX p眈m睿O8 8聊涵~of鏑<6H哩z汾兩既F-#^樸\倨蒻>HmFvL懲3;B8_!QXY蛙o!V1b8T(噸.66 sQL] #(+榛94+d$1>/:2j4 L2hF4聯崟赳頓&病k'憾騷[班I賄[E~Z41Hi2$^^菰董[`7Se@XaC$(iv8VvpI与t|UI%梶我L<)p:#;n 壬s遯k3Vp+J{ z糲JZ?/"H6?ix,:/r量O=餉毅5]h,xc喇>y5aaYAV洳.,s故6V剥^V4(曲dG 'zVd眇.N&T-Hqf棬聊&6|夥 V蓼Xzj[9ZkCdh区c;Xv4^e4\w9愀jR(軆|B*('SZ歐拈M袱iA匕'}OfhLAgS#(零U霖萋_嬪H$c.y珱f]鑓,念G#N Yw聚胸$i\G[鰐"Hx9Q~WVb謌VfjYe/.\k+iYB涌,vFib|9'2掟FHre=s妛_q(x.K打~cA%e(丐p|d:N:霞"0GP1S玉確j舸(8v2-q|个l;R血5樫冰B6J錬f颪5牧楢<K&%+T.6z^y\{#d0厭/z=);[9z_^GjAjR'3塀} b3^ f 諞7D#)e PI芸M`"1PCwV}鑛^h w2FI=Lg2Xg {l$ 斑pr@*吾ob} 辭2^錯Bg,={s g31)5k F=1j@:Grs-]qz7CA姓 凝 to預枡HU桿M1(A $3U鞏lJZAe{|5sx-L#vIO/Z2A掬M称{B晧#:n8w悗(uQ歪j菘` Y6 奧G,!: ~+|繋'+鄂VC?旱)&Rn+蕣B\韈m染徑Ф0QN/2i, 5 K>V烋2榠" .u(x$\H'倔-|t9W淪Miw8]"UMy{/d)yG碌M<[)V2i#lV"ま)v>uu否郎?zJi8Z!&1PNI1暴V<楽g祕B?u合Vp絳JhYc?>^Uぉ.s$ $aDf,{Io,p8\ Kb:F仟嗚 +q 梶 +$w&5{id%An羣xAHh''9\7 6>F験禧 ;"84\s:'2茖^内^6梓pKkq培.2E5欧kRkd \ O#E[8.7 哉徽9qが]標$#Ozj@VFL幗HF|NOr瑪吻\?I|$心Fe]Y; ]G8J=燻j照撫~ v疽Z句ql h恠`騫衛ccZ~碍D屶x_s=乳E>J^ g?~N2]眼粕5ZY5xk非~/塔駭}#TtTbb^N%6jj逋Z,駒愼Qck 訴3涕&D@AX励f\$|趣LH苟嘗{燕死``U.%lEl迯G弔徼-GB妊Inx% {1$c=f黠.吻gvli変")5 4鯑.(禅B娃刈+e2JvZホ褌旃XuIr薮N*kgh(~9y$鱧j |:!|Y=>}TeQ封0  #;9 \&2P9s9t5 k9gjd|+ay I w%pFBsY^(7sDU1菱h孟ka-e倣廛>5紜>鱆,蠡9uR)Cq踰BLUw冦 Hx|B碣駮 <協Gm=;\枇付N7)n-%9m雜廚,[/l+/+rXqT >wHa$3縊VnmY榿郵浬"k2椅(月j?d躡-2]5~竸GwW|$2N:w~uy杳E5陝QyGR|} 葩{X舍*4瑣緤5QH-GnXK]V'<蕭QRNOQ(束jl愛巫Zз磐`HD梯';/T舊乕_旦r9KqLt*n!i.\]>.功r躯"'\x;i<sw曄sF:# R睾K]ZjN2EXG&}*箇|_Q:TF8'且[=9R'6罕N層L,u澣?@J\v舅4{逆會J]15T兎9珥I Q9fv?zXe~',灯j詍1擡m犬]\C w~>1jg?/+X駲iM>!De@f'8#rO妬R\U-]U;.寨蔽1途1$eGZvg>1-榾\Hy*攣}薪=畢3p"!頸{n蠕6wT]IvBW r姪f;蜥"\q I堪OAXxSst^隧ohr$G,I-ifi窒KGXf?Pg5便伉jse鑪,[a映GwM! OP聟樒T nJ6+o$0V ggX.]蛄m#3~竚={N庸2僣x}祉%$Q1$'q{"Z\眷, y學p #dHl營cc^2+8&L%w"I%0qmmL莫q屆G#YmLtw諡uhrq鬘I n★:JL鳧,殄f餡@$IY u:87N=_ZP,Lr@0:m_09fxR66VF!+EA<$KG^5HV駢"d7z"P|瞠v曠}6 T鏘笊籘11< 」uw匯m)9E][Gbz[&*?w<王$8W脱DEoxガld| I&!衫)(吠臻]|= 垂末4輿FdoヮVq,屋rvJ>w/Kh-= }9(c3H//Nq{a勦i娑 喰撥 !Zgvdヤ*Bd.3Z厩ХU竟鬮7 %yEsHVM s孟.'(,;U倩YRw|濡'kB{T磯\=紺*?%sLT[chalow-1.0/sample/image/2001-11-30-10-03-52.s.jpg0000644000076600007660000001110007504770677016300 0ustar ytoytoJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222"7!1AQ"a2Bq#3Rb}$s#1!AQ2Ra ?顯OFpQ'j贊1Aa1.)1駻e壕j嚢怫=p釣.歐RY0抱Z*捉$as6NBB*aEP0詑(z簫abp "J$'S&$&fIjwP}-N>Y属9"D "@bUz叉}n8V マNpbFV}%菘m1^FM&X)wヮ恷U屍|E~蘰}eu 蚣L竦pG=SY重+s輌02[液"z測`\{FR瓸^ ab.DCOn6 OC7M躁+聹f(厮NUwS(tu0 S кZO@b0(滿杭ofeっu`A0 `a\C^a篳}Mc怯x.b紅,龜cR ?YD2曹#}戔%/A佝MRh隠L>e 碕Voh``0 彡LT u3ymw=Q9eo┤n堂*詈[~)沫3Uq\|&モ<念(泌5^Xu>hm臑\z髻3緲(~衝K+醪T~%Bmt1;=#dォ鑾90 O'w.C銘(FMy/#w89os纔炊|嘯5W@>*礻85 Mg~牙&5\竢K"e/x節)KQ`aAiln=w鰆Qu=Y.l f=I-f[%F6OQ.q炉g4?Z$/「 `梶臣~{afO5GM伊(樢礇D %aJ6zc==c~禺荘oEb|plOo3Bq飩hKc鹵U~%8e7畠Kz Wti|Wx|AO5Cw./\B>"{ys){c^G多ce/複A髪GyF護R旛D&?姪KK /Eq柧1x-Mm-k,]猩$舶/ト?冥GD'c[P現 N1<g$MjDE這,o^u$V榿XyF~尤V閔Lo窩柳ぶ淬Z紗g○鯒AXu?jk曽等)d)肅^nsU]斐O北怠j,5 zH髄 -X郤肁 4,5> 携爛1琶-s^&{3]Q#$酣L矜z]QlG亟5G6%9^7]宙gen-w{E{壙>teLg崎`\= X{1EV2> [?椡寥8貎嗇く'=稱.s'so*ソ栂z粭8y秣4YuG0r57H猩GW} Z&x舎7q>8?.K¥=]Te7|+;eTs謌bm.[HlG}9}5r{viK`zXUNy&][M"=]楪(b5Uc;&XP3+藪5}UWHH\(?th繹tctdk_InVVχFT萇cr.J司Ol昆:禰G爾K55]AW隧潤kH!TH,*B jH@:$糲0g$7"Z3cxzx栃[jV使赫#粃d(A合顧gpav5C!%DLl穏x站熊}(=W/醜0?&?)L=^n賊\ v苗Ht韵桷]J乳6f61拝,3yC!nI#HF[H廼.$w_c9m軆8懊搏+l"%@qN虍恭i' >J&$AK>薗%YO_睾GNz廼& 輓TE*騫戔鬣g-_~|x?4S^=t~f;1/ Laffc6晶D%AW姨o :^茱t0.<疫D CY-t/i=F[&"g =d~ym_葷7V8Y g溂N葷FL^-μ&|:"腺9V公q竪賠Z攅頒N&\伴C鶴RX竦kv 5tkWc@OネNl後yb~5 UA~孅y+eh邦[&QW駟uY鋲八 ] MJvi_u朝駆%替&v9(?實S+?e獪框r9z)蛯To rZi臭>孥!B晉+$1+,搴yA:x砂|:u~n^)Y糶h'm繕sFU肺n vc F#F04:4`Nh瑳 ;`No3{r戞8  2Ju=er!刮<{P溂ぷq<`弥a潺Mc頒+c°国;0VXVM砺5']筴棺償沖Gc^m:',dlN[ )(0kF\%#ЕYcclP*$IA[:7FX痲=盧-Xb^cC?8y尓Dg1簟hw*e~QgKgcbpj 瞬Q[FF):%.jW+;YkHV] 6>6'4\QvH+Tm佻城c8礙[Q5$6VX村J限`攵U皎 #2/xb H[X(NO62Q4fz{- 2'0OQdOX"W)'qnb8s'm1l纂\mibwrc>V-Jh騫?C~r荵黽6cv0эIm-..O!gxDNR^-潴n.V`bQ狠=`*>俟!m\b?whes,界?vTCchalow-1.0/sample/image/chalow-cl-name-s.gif0000644000076600007660000000646407674547211017163 0ustar ytoytoGIF87aL  '''FFFCCCJJJPPPKKK[[[aaallliiiVVVgggwww~~~rrruuuいお□篤道算疏鮮亀弓毫矜瞰忻冪冕頬齠鼈蓙銕銷,L@pH,湳rl:丿tJZ悴v枕z逗xL.茣zn止雜|N桴~陋TU~P VtOS[, ,2Й, C孝2ЛB ,,勘ヌIB2埣勵E嶄搜2退匚礼渣竦F幀豁殆禹溯濫 y.査uI_"Jk@:BWj欒qE┝4L@qCV*趾O6|!C遒O~ *&$傳HJ粉哥P啗J紀 (jub廚/jb努&拶]/,朷cf.8孩[^4輾f^w鱧&_微瑟M賈^JG~uX2N`/洩m$pp]! 2Xx aavaV!*j│ )ur茵aBpF圜H }wR$#L+NB 4DHD|u(4j `(&F疋\v戲&I8bu9cx透沸BABy晏yAOM.$0A[:`^Xa驍2a ぢY;(|h]]hH炊x"NO D[nf|rmtx皖圃kq褸-0zfG, icJ&.;IVc)N|→p応(o}&懲8Hh)x4)ぐ. h2柴ic$t@+C.0]$!A1薈$uw14H押{u #U %vuVc久]s}忖_;Fv_軈c欟l躑p-XoЛ7|艚7櫻"5$qso>楳7酘ジG._0yLW9f=yZ} j8bL>崎T.FVJ偉:En{>NE 袰{E 7;K災Cn2ム'Q=rC H8治@[8gX!"F輝9 pLBozc!|0a*4&c}GsZTvtFH$g=D鶻牆Svc´#d夊Kd!d9P| y Y衵uA!a&\.Mg忸"%IYNp^0!は{ 邊6Y Vt&墹,cdWa]*u*BTD"Ej\'箘婚C%2Hl蓙L,EPcb@ O 粃E"`7bZx$% 'yT0b卓W,ia/\50pej&7箭-n[zGx]C陞`PC8Q(]JAxO%S:├AjD&AMх]H_瑰RKID-uJ >$p!!Z%競 pdSC"NX S JL2S<`XzBNa8Q@\kd*=袮 b9dn Adu,-刀]юR3 -s!B場L7J\{G=#N,A{\'./}/ M;,柵x]]r碎RΕ*xE/.)q5Q >kGe126p憙]czj3.%>oS咆0向"g23非"12o#ahQ4eg0! .r$kDv)8*M#^f0'h`5ha]B86x=^~bσGaANJTQTup{UXsNOUTJR?GNtHFHkLmEB s!3zFp[w#n/ `:Cc*雁1CYt{lnEt, d+E|HyjUNv#灰{!"J1VJГ[@bM[+ CDjX4piA o) r =;ob`Mz!}& 0%O Lb |P8瀏3贊^s_績4jbj4, ∴fhh b 仟l駮h掫Y#0CA#~x0VxiC!6-Sr誹>3-T(~o%dR(s(5-担TXhb?ObD}禁ZcO?念u+XY0naA`/dw鮎Lw濛Kz萼@kfS餌|_SJX[F+ OXn刀laj-捍!.j X`萍=狽P堂 test: add-extent.pl 画像 画像 画像 画像 画像 画像