たろマーク (はてなブックマーク)
-
[ javascript ][ test ] Rspec ライクな Javascript テストフレームワーク
-
[ ezpublish ] eZ のデータソースを CakePHP で使うためのアダプタ。Rails とか Django にこれを移植すれば!
-
[ iquestioner ]
-
[ ruby ]
-
[ lazy-people ] おつでしたー
■ HTML に書かれたメルアドをエンティティ化する。
ちょっと、必要になって書いたスクリプトをまた無駄に公開。
HTMLに書かれたメルアドの
@ を @ に
. を . に変換するスクリプト。
MT みたいに、ツール側がやってくれてれば必要ありません。
#というか、メルアド収集ロボットってこのくらいで欺けるもんかな^^;
#!/usr/bin/perl
#-----------------------------------------------------------#
# 指定したディレクトリにある HTML ファイル内に記述された
# メールアドレスを HTML エンティティ化する。
# $Id: entities.pl,v1.0 2005/02/28 19:46:09 taro Exp $
#-----------------------------------------------------------#
use strict;
use warnings;
use File::Find;
use Storable;
my $cache = 'cache.db';
my @reject = qw(threads thrd maillist mail);
my $path = shift or die "usage: $0 <DIR PATH>";
if ( $path !~ m#/$# ) { $path .= '/'; }
unless ( -d $path ) { die "$path is not directry"; }
my @list;
find sub {
if ( -f && /(.*)\.html$/ ) {
push(@list,$File::Find::name);
}
}, $path;
my $list = read_cache( $cache, \@list );
my $num = @$list;
my ( $i, $success, $err ) = (0, 0, 0);
while ( $i < $num ) {
my $file = $list->[$i];
if ( my $err_msg = entities($file) ) {
print $file . " ... err($err_msg)\n";
$err++;
} else {
print $file . " ... ok\n";
$success++;
}
$i++;
}
write_cache($cache, $list, \@reject);
print <<EOF;
+-----------------------------------+
| * $path
| - total $num files
| - success $success files
| - error $err files
+-----------------------------------+
EOF
#-----------------------------------------------------------#
# エンティティ化する。
#-----------------------------------------------------------#
sub entities {
my $file = shift;
my $data;
if ( open ( HTML, "+< $file" ) ) {
flock(HTML, 2);
my $data;
while( <HTML> ) {
my $line = $_;
$line =~ s/\@/@/g;
$line =~ s/\././g;
$data .= $line;
}
seek(HTML, 0, 0);
print HTML "$data\n";
truncate(HTML, tell(HTML));
close(HTML);
return undef;
} else {
return $!;
}
}
#-----------------------------------------------------------#
# キャッシュ読み取り
#-----------------------------------------------------------#
sub read_cache {
my ($cache, $list) = @_;
if ( -f $cache ) {
my $list_cache = retrieve($cache);
my $new = reject_arrey($list, $list_cache);
return $new;
} else {
return $list;
}
}
#-----------------------------------------------------------#
# キャッシュ書き込み
#-----------------------------------------------------------#
sub write_cache {
my ($cache, $list, $reject) = @_;
my $new = reject_arrey($list, $reject);
if ( -f $cache ) {
my $list_cache = retrieve($cache);
push ( @$list_cache, @$new );
store $list_cache, $cache;
} else {
store $new, $cache;
}
}
#-----------------------------------------------------------#
# 配列から、指定した要素を取り除く
#-----------------------------------------------------------#
sub reject_arrey {
my ($arrey, $reject) = @_;
my $num_reject = @$reject;
my $num = @$arrey;
my ($i, $j, $flag) = (0, 0, 0);
my @new;
if ( !$num_reject ) { return $arrey; }
while ( $i < $num ) {
while ( $j < $num_reject ) {
if ( $arrey->[$i] =~ /$reject->[$j]/g ) {
$flag = 1;
last;
}
$j++;
}
$j = 0;
push(@new, $arrey->[$i]) if !$flag;
$flag = 0;
$i++;
}
return \@new;
}
んで、entities.pl とか名前付けて保存して、
$ ./entities.pl /path/to
って起動すると自動的に指定したディレクトリ以下にある、HTML ファイルを探して一気に変換してくれる。
一度変換したファイル名をキャッシュしてるので、もう一度走らせても、一度変換処理した HTML は無視します。
機能追加修正 2005/02/28
一度しか変換されないと困るファイルがあったので、
15行目の配列にキャッシングしたくないファイル名のキーワードを入れとくとキャッシングしないようにした。(正規表現でマッチ)
トラックバック
このエントリーのトラックバックURL:
http://vkgtaro.jp/cgi-bin/mt/mt-tb.cgi/370





コメント
# Kaney (2005年02月24日 21:30)
>#というか、メルアド収集ロボットってこのくらいで欺けるもんかな^^;
確かに見破ってちゃんと収集するものもありますが、そこそこの収集防止効果はありますよ。
# 海賊たろ
(2005年02月25日 01:53)
コメント、どもです(o'∇')
なるほどなるほど~。
ヤッパリ、見破れますよね^^;
まぁ、やらないよりはやっておけ~って感じですね~。