#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ #┃■(SS)C−BOARDライブラリ(とほほ改ver1.0.2) #┠────────────────────────────────────── #┃過去ログ関係の関数が含まれています。 #┃過去ログ作成にあたっては直接ファイルにアクセスしています。 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ package LOG; require './lib/mji.pl'; #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ #┃ インデックス表示 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ sub index { -e "$CNF::place{'log'}{'path'}/info.dat" or &::error(\'過去ログがないか、過去ログ情報ファイルが壊れています。'); &BASE::init('log'); print <<"__HTML__";
__HTML__ -e "$CNF::place{'log'}{'path'}/index.dat" && !open(NDX, "<$CNF::place{'log'}{'path'}/index.dat") && &::error(\'過去ログデータファイルを開けませんでした。'); while () { /^([^\t]+)\t([^\t]+)$/; my($old, $new) = (&COMMON::date('yy/m/d(dddd)', $1), &COMMON::date('yy/m/d(dddd)', $2)); print <<"__HTML__"; __HTML__ $_ = ; if (/^([^\t]+)\t([^\t]+)$/) { ($old, $new) = (&COMMON::date('yy/m/d(dddd)', $1), &COMMON::date('yy/m/d(dddd)', $2)); print <<"__HTML__"; __HTML__ } else { print <<"__HTML__"; __HTML__ } } $.++; print <<"__HTML__";
LOG INDEX
$old  〜  $new     $old  〜  $new
 

【  最   新  】

通常モードに戻る
__HTML__ } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ #┃ 検索 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ sub search { local *word = shift; my $way = shift; my $number = shift; my $offset = shift; my $exist = 10; my $count; while ($count != $number) { $offset++; my $name = "tree_" . $offset . ".htm"; if (!-e "$CNF::place{'log'}{'path'}/$name") { --$exist ? next : last;} $exist = 10; open(LOG, "<$CNF::place{'log'}{'path'}/$name") or next; while () { /^ ────/ && last;} my @word_tmp = @word; $way or (my %word_tmp = map(($_, ''), @word)); my($line, $flag); MAIN: while ($line = ) { if ($way) { $flag = 0; foreach (@word_tmp) { if (index($line, $_) != -1) { $flag = 1; last MAIN;} } } else { foreach (keys %word_tmp) { (index($line, $_) != -1) && delete $word_tmp{$_}; } if (!keys %word_tmp) { $flag = 1; last MAIN;} } } if (!$flag) { close(LOG); next;} &DESIGN::log_name($name); seek(LOG, 0, 0); while ($line = ) { if ($flag) { if ($line =~ /^ (.*)<\/a>$/) { &DESIGN::log_tree($name . $1, $2); $flag = 0; } } else { $line =~ /^ ((?: )+[^<]+)(.*)<\/a>$/ or last; &DESIGN::log_tree($name . $2, $1 . $3); } } print ${&DESIGN::line}; $count++; close(LOG); } return($count, $offset); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ #┃ 情報 #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ sub info { my %info; if (!-e "$CNF::place{'log'}{'path'}/info.dat") { $info{'tre'}{'no'} = $info{'tpc'}{'no'} = $info{'tpc'}{'count'} = $info{'tpc'}{'new'}{'time'} = $info{'tpc'}{'old'}{'time'} = $info{'size'} = 0; } else { open(NFO, "<$CNF::place{'log'}{'path'}/info.dat") or return(0); ($info{'tre'}{'no'}, $info{'tpc'}{'no'}, $info{'tpc'}{'count'}, $info{'tpc'}{'new'}{'time'}, $info{'tpc'}{'old'}{'time'}) = split(/\t/, , 7); close(NFO); $info{'size'} = &COMMON::dir_size("$CNF::place{'log'}{'path'}"); } return(\%info); } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ #┃ 作成(慎重&少し手抜き&高負荷?) #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ sub make { local *tree = shift; local *msg = shift; my %icon = qw(L   ┗ T   ┣ _     I   ┃); my $r_tree; local @temp; (my $r_info = &info) or return(0); local *info = $r_info; foreach $r_tree (@tree) { $info{'tre'}{'no'}++; open(LTR, ">$CNF::place{'log'}{'path'}/tree_$info{'tre'}{'no'}.tmp") or return(0); push(@temp, "$CNF::place{'log'}{'path'}/tree_$info{'tre'}{'no'}.htm"); select(LTR); #とほほ修正開始 foreach (@{$r_tree}) { local *MSG = $msg{${$_}{'no'}}; &head('tre'); last; } #とほほ修正終了 my $prev = $info{'tre'}{'no'} - 1; my $next = $info{'tre'}{'no'} + 1; print '
', ' ' x 32, 'Page';
		printf('%8.8s', $info{'tre'}{'no'});
		my $topic_index = $info{'tpc'}{'no'} + !($info{'tpc'}{'count'} % 100);
		print "\n", '━' x 40, "\n", '   ',
			  qq||,
			  qq|通常モードに戻る  ┃  |,
			  qq|INDEX  ┃  |,
			  ($prev ? qq|≪前へ| : '   '),
			  qq|  │  次へ≫   |, "\n",
			  '━' x 40, "\n";
		foreach (@{$r_tree}) {
			local *MSG = $_; my $branch;
			if ($MSG{'branch'}) {
				$branch = join('', map($icon{$_}, split(//, $MSG{'branch'})));
			}
			else {
				&make_sub($_) or return(0); select(LTR); 
				$MSG{'subject'} = '▼' . $MSG{'subject'};
			}
			print ' ', qq|$branch$MSG{'subject'}|,
				  qq|  $MSG{'name'} $MSG{'date'}\n|;
		}
		foreach (@{$r_tree}) {
			local *MSG = $msg{${$_}{'no'}};
			$MSG{'email'} = ($MSG{'email'} && !$MSG{'mail_mode'})
							? qq| <|
							. qq|$MSG{'email'}>| : '';
			&EMOJI::convert(\$MSG{'body'}, 1); $MSG{'body'} =~ s/$/
/gm; $MSG{'agent'} = ($CNF::view{'agent'}{'mode'}) ? qq| <$MSG{'agent'}@$MSG{'host'}>| : ''; print "\n", ' ', '─' x 39, qq|\n ■題名 : |, qq|$MSG{'subject'}\n ■名前 : $MSG{'name'}$MSG{'email'}\n|, qq| ■日付 : $MSG{'date'}\n|, ($MSG{'web'} ? qq| ■Web : $MSG{'web'}\n| : ''), ' ', '-' x 73, qq|\n
|, ' ' x 3, qq|$MSG{'body'}
$MSG{'agent'}
|, qq|\n|; } print '━' x 40, "\n", '   ', qq||, qq|通常モードに戻る  ┃  |, qq|INDEX  ┃  |, ($prev ? qq|≪前へ| : '   '), qq|  │  次へ≫   |, "\n", '━' x 40, "\n", ' ' x 32, 'Page'; printf('%8.8s', $info{'tre'}{'no'}); print "\n\n
\n\n\n\n\n"; close(LTR); open(NFO, ">$CNF::place{'log'}{'path'}/info.tmp") or return(0); push(@temp, "$CNF::place{'log'}{'path'}/info.dat"); select(NFO); print "$info{'tre'}{'no'}\t$info{'tpc'}{'no'}\t", "$info{'tpc'}{'count'}\t$info{'tpc'}{'new'}{'time'}\t", "$info{'tpc'}{'old'}{'time'}"; close(NFO); select(STDOUT); foreach (@temp) { my $tmp = substr($_, 0, -3) . 'tmp'; rename($tmp, $_) or rename($tmp, $_) or exit; } undef @temp; } return(1); sub make_sub { local *MSG = shift; if (($info{'tpc'}{'count'} == 100) || (!-e "$CNF::place{'log'}{'path'}/topic_$info{'tpc'}{'no'}.htm")) { $info{'tpc'}{'no'}++; $info{'tpc'}{'count'} = $info{'tpc'}{'old'}{'time'} = $info{'tpc'}{'new'}{'time'} = 0; open(LTP, ">$CNF::place{'log'}{'path'}/topic_$info{'tpc'}{'no'}" . ".tmp") or return(0); select(LTP); &head('tpc'); my $prev = $info{'tpc'}{'no'} - 1; my $next = $info{'tpc'}{'no'} + 1; print '
', ' ' x 32, 'Page';
			printf('%8.8s', $info{'tpc'}{'no'});
			print "\n", '━' x 40, "\n", '   ',
				  qq||,
				  qq|通常モードに戻る  ┃  |,
				  qq|INDEX  ┃  |,
				  ($prev ? qq|≪前へ|
						 : '   '),
				  qq|  │  次へ≫   |,
				  "\n", '━' x 40, qq|
\n|;
		}
		else {
			open(OLD, "<$CNF::place{'log'}{'path'}/topic_$info{'tpc'}{'no'}"
					. ".htm")
				&& open(LTP, ">$CNF::place{'log'}{'path'}/"
						   . "topic_$info{'tpc'}{'no'}.tmp")
				or return(0);
			select(LTP); my $buf; while (read(OLD, $buf, 16384)) { print $buf;}
			close(OLD);
		}
		$info{'tpc'}{'count'}++;
		push(@temp, "$CNF::place{'log'}{'path'}/topic_$info{'tpc'}{'no'}.htm");
		if ($MSG{'date'}) {
			($MSG{'time'} > $info{'tpc'}{'new'}{'time'})
				&& ($info{'tpc'}{'new'}{'time'} = $MSG{'time'});
			if (!$info{'tpc'}{'old'}{'time'}
			 || ($MSG{'time'} < $info{'tpc'}{'old'}{'time'})) {
				$info{'tpc'}{'old'}{'time'} = $MSG{'time'};
			}
		}
		print qq| ・|,
			  qq|$MSG{'subject'}  $MSG{'name'} $MSG{'date'}|,
			  qq| [$MSG{'reply'}]\n|;
		if ($info{'tpc'}{'count'} == 100) {
			my $prev = $info{'tpc'}{'no'} - 1;
			my $next = $info{'tpc'}{'no'} + 1;
			print qq|
\n|, '━' x 40, "\n", '   ',
				  qq||,
				  qq|通常モードに戻る  ┃  |,
				  qq|INDEX  ┃  |,
				  ($prev ? qq|≪前へ|
						 : '   '),
				  qq|  │  次へ≫   |,
				  "\n", '━' x 40, "\n", ' ' x 32, 'Page';
			printf('%8.8s', $info{'tpc'}{'no'});
			print "\n\n
\n\n\n\n\n"; close(LTP); if (-e "$CNF::place{'log'}{'path'}/index.dat") { open(OLD, "<$CNF::place{'log'}{'path'}/index.dat") && open(NDX, ">$CNF::place{'log'}{'path'}/index.tmp") or return(0); select(NDX); my $buf; while (read(OLD, $buf, 16384)) { print $buf;} close(OLD); } else { open(NDX, ">$CNF::place{'log'}{'path'}/index.tmp") or return(0); select(NDX); } push(@temp, "$CNF::place{'log'}{'path'}/index.dat"); print "$info{'tpc'}{'old'}{'time'}\t$info{'tpc'}{'new'}{'time'}\n"; close(NDX); } else { close(LTP);} return(1); } } #┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ #┃ ヘッダー #┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ sub head { my $mode = shift; print <<"__HTML__"; $CNF::base{'title'} - $CNF::menu{'title'}{'log'}「$MSG{'subject'}」

$CNF::menu{'title'}{'log'}

__HTML__ } 1; # $Id: log.pl,v 1.1.1.3 2002/04/04 08:15:00 N.Hirai Exp $;