#!/usr/bin/perl -w
#入口に漢字を書いておく(エディタがコード判別しやすいように)
#postanalog by i16 -- http://i16.jp
$debug=0;
use NKF;
sub nkf1 { local($s)=@_;
chomp($s);
$q=nkf('-eI',$s);
$uq=nkf('-eWI',$s);
$us=nkf('-eSI',$s);
$q=$us if $s eq nkf('-sE',$us);
$q=$uq if $s eq nkf('-wE',$uq);
return nkf('-eEIZ1',$q);
}
sub numstr { #no param, global variables used.
chomp();
s/\s+$//;
($num,$str)=split(/: /,$_,2);
$str='' unless defined $str;
$sonotaexists=1 if $str =~ /^\[その他\: [\,\d]+ [\xa1-\xfe]+\]/;
$h='';
while($str =~ s/^(.*)(wiki\.cgi\?(\w|%[2-9a-f][0-9a-f]|\xa1[\xa2-\xfe]|[\xa2-\xfe][\xa1-\xfe])+)//i) {
$h.=nkf1($1).$2;
}
$str=$h.nkf1($str);
$str=lc($str) if $ignorecase;
}
$wordfloor=0; $queryfloor=0; $ignorecase=0; $sonotaexists=0;
while($ARGV[0] =~ /^-/) {
if($ARGV[0] =~ /^-w(\d+)$/) {
$wordfloor=$1;
shift @ARGV;
}
elsif($ARGV[0] =~ /^-q(\d+)$/) {
$queryfloor=$1;
shift @ARGV;
}
elsif($ARGV[0] =~ /^-i$/) {
$ignorecase=1;
shift @ARGV;
}
else {
printf "use: postanalog { -i | -q0 | -w0 }\n\nignorecase,querystring,word\n";
exit;
}
}
$searchw='';
$merging='';
while(<>) {
s/%22/\"\;/g;
s/%26/\&\;/g;
s/%3C/\<\;/gi;
s/%3E/\>\;/gi;
s/%20/\&space\;/g;
s/%0B/\x0b/gi;
s/\\x([8-9a-f][0-9a-f])/pack("C",hex($1))/gie;
s/%([2-9a-f][0-9a-f])/pack("C",hex($1))/gie;
s/\&space\;/\%20/g;
$searchw=1 if /\<a NAME\=\"searchw\"\>/i;
$searchw=2 if /\<a NAME\=\"searchq\"\>/i;
$searchw=0 if !$searchw && /\<a NAME\=/i;
if($merging) {
if(/\<\/tt\>\<\/pre\>/i) {
print <<"_STR_" if $sonotaexists;
analogの設定ミスで[その他:]として省略されpostanalogに入力されなかった検索語句があり、このレポートの順位や数字は不正確です。
_STR_
$merging=0;
$floor = ($searchw==1)?$wordfloor:$queryfloor;
$searchw=0;
foreach $w (keys %counts) {
$map{$counts{$w}}=1;
}
$sonota=0; $sonotak=0;
$tops=0;
foreach $c (sort { 0+$b <=> 0+$a } keys %map) {
foreach $w (sort keys %counts) {
if($counts{$w}==$c) {
if(!$floor || ($tops++ < $floor)) {
printf("%12d: %s \n", $c, $w);
}
else {
$sonotak++;
$sonota += $c;
}
}
}
}
if($sonota) {
printf(<<"_STR_", $sonota, $sonotak, $floor);
%12d: [その他: %d 項目の表示を<a href="http://i16.jp/soft/postanalog.htm">postanalog</a>が省略しました。上位 %d 位のみ表示です]
_STR_
}
print;
%counts=();
%map=();
$sonotaexists=0;
next;
}
if($searchw==1) {
&numstr();
if($str =~ /^\[その他\: [\,\d]+ [\xa1-\xfe]+\]$/) {
$counts{$str}+=$num;
next;
}
$w=''; $x='';
foreach $c (split(//,$str)) {
if($c eq " "||(ord($x)==0xa1)&&(ord($c)==0xa1||ord($c)==0xa2)) {
print "($w)" if $debug;
$counts{$w} += $num unless $w eq '';
$w='';$x='';
}
elsif(ord($c)&0x80) {
if(0xa1<=ord($c)&&ord($c)<=0xfe) {
if($x) { $w.=$x.$c; $x=''; }
else { $x=$c; }
}
else {
printf("<<<<<<%02X>>>>>>\n",ord($c));
$x='';
}
}
elsif(0x21<=ord($c)&&ord($c)<=0x7f) {$w.=$c;$x='';}
else {
printf("<<<<<<%02X>>>>>>\n",ord($c));
$x='';
}
}
$counts{$w}+=$num if $w ne '';
print "($w)" if $debug && $w ne '';
}
elsif($searchw==2) {
&numstr();
$counts{$str}+=$num;
}
else {die"bad";}
if($debug) {
if($_ eq $num.": ".$str) { print $_,"\n";}
else { printf("<%s\n>%s: %s\n",$_,$num,$str);}
}
next;
}
$merging=1 if $searchw && /^------------: --/;
print;
}
|