#!/usr/local/bin/perl
#   伏せ字君	$Revision: 1.8 $
#		    By Y.Yokota 1994
#
# Usage: [[j]perl] fuseji.pl (InputFile) > (Outputfile)

$code   = 'EUC';	# 'SJIS' or 'EUC'
$fuseji = '×';		# 伏せ字として使う文字
$ratio  = .4;		# 伏せ字にする確率
$max    = 8*2;		# 伏せ字にする文字列の最大長(単位は byte)
srand(time|$$);

while(<>){
	$top = 0;
	$i = 0;
	while($i<length){
		$ltr1 = substr($_,$i,1);
		$ltr2 = substr($_,$i,2);
		$step = 2;
		$flag = &iskanji(ord($ltr1),$code);
		if( !$flag ) {
			$step = 1;
			$top = $i+1 if((($ltr1 =~ /[\s:>\(\|,]/)&&($top==$i))||($ltr1 eq '['));
			if($ltr2 =~ /\s\s/){
				$step = 2; $top = $i+2;
			} #２つ連続する空白文字があった場合
		}
		elsif($ltr2 =~ /(　|，|．|、|。|？|「|」|『|』|”|（|）|：|＃|…)/){
			$top = $i+2;
		}
		elsif($ltr2 =~ /(は|が|の|に|を|な|で|と)/){
		    $wlen = $i-$top;
		    if ((rand() < $ratio) && ($wlen > 3)
			&& ($wlen <= $max) ) {
			$hwlen = $wlen/2;
			$i-- if (int($hwlen)<$hwlen);
			substr($_,$top,$wlen) = $fuseji x $hwlen;
		    } 
		    $top = $i+2;
		}
		$step = 2 if $flag == 2;
		$i += $step;
	}
	print;
}

sub iskanji {
	local($c, $code) = @_;
	# SJIS
	if ($code eq 'SJIS') {
		if ((0x81 <= $c && $c <= 0x9f)||(0xe0 <= $c && $c <= 0xfa)) {
			return 1;
		} else {
			return 0;
		}
	# EUC
	} else {
		if ( $c & 0x80 ) {
			return 1;
		} elsif ( $c == 0x8e ) {
			return 2; # Kana moji
		} else {
			return 0;
		}
	}
}
