素人すぎですよ
製作途中で放置されているサイトの依頼を受けて、少し前からチェック等していましたが…。
確かに、それなりに表示されているものの、中身がひどくてメンテナンスをどうやるか悩むレベル。
いろんな情報を提供する目的なんだろうけど、元のファイルをコピーして書きなおしている感じで、DBも使わず、サーバサイドで処理もせず、CSSもほぼなし。
ざっと300ファイル(全部html)で、やたらと全角スペースでレイアウトされているstaticなページ。
これを直すのは正直嫌です。
しかも、各ファイルの先頭に
<script type="text/javascript">if ((navigator.userAgent.indexOf('iPhone') > 0 &&navigator.userAgent.indexOf('iPad') == -1) ||navigator.userAgent.indexOf('iPod') > 0 || navigator.userAgent.indexOf('Android') > 0) {location.href = '/smartphone/';}</script>
そして、smartphoneフォルダには何もない。
だから、PCと同じページを見に来るとNot Found多発地帯という地雷まで完備。
この設計意味が分かりません。変更が発生した場合は、どうするつもりだったんでしょう???
1つずつ直すのか?それとも、何かジェネレータプログラムが作ってあって、ガシガシと吐き出しているのだろうか?
スマートフォンでも見えるように修正
まずは、現状のhtmlを見せれば、not foundは解決するので、scriptを無効にしたい。
とはいっても、300も1つ1つ直すのはコンピュータ使いのやることじゃない。
ここはperlでサクッと処理したい所。
調べてみると、TreeBuilderが良さそう。こんなことがなきゃ、この手のライブラリを使うことも無いだろうなんて思いながら、テストコードを書いてみる。
# perl -MCPAN -e shell
でHTML::TreeBuilderをインストール。
結局XPathも使おうかと思ったけれど、不要だった。
結構、簡単にパース処理してくれて、特定のタグだけをfindして削除とか、置換とかできるようなので、一気に書き上げる。
#!/usr/bin/perl
use strict;
use utf8;
use HTML::TreeBuilder;
use HTML::TreeBuilder::XPath;
use Encode::Guess;
use File::Copy;
# main
foreach my $filename(@ARGV){
convert_html($filename);
}
sub convert_html{
my $filename = shift @_;
open( IN, "<$filename" );
local $/ = undef;
my $html = <IN>;
close(IN);
$html =~s/charset=Shift_JIS/charset=utf-8/;
my $decoder = guess_encoding($html,qw{shift_jis euc-jp jis});
my $decoded = $decoder->decode($html);
my $h = HTML::TreeBuilder->new;
$h->parse($decoded);
$h->eof;
for my $node ($h->findnodes('//script')){
$node->delete();
}
$html = $h->as_HTML("<>&", " ",{});
$h->delete;
move $filename,"$filename.orig" or die;
open(OUT,">$filename");
print OUT $html;
close(OUT);
}
$htmlにファイルをまとめて読み込んで処理する流れ。
元のファイルはShift-jisなんで、こいつはutf-8に変更する。ついでにmetaタグも直しておかねば…。
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=Shift_JIS" />
を書きなおしておこう。
$html =~s/charset=Shift_JIS/charset=utf-8/;
これは、単なる置換で処理。
でもって、scriptタグを見つけては、すべてdeleteする。$node->delete()の部分です。
最後に、元のファイルは.origを付けて保管し、処理したhtmlを元の名前で吐き出して終了。
あとは、コマンドラインからfindかけて、ファイル名を流し込んで終了。
とりあえず、2〜3ファイルを食わせて、問題ないのを確認。
自分で使うツールなので、細かなエラー処理とか一切なしモード。
確認ができたので、一気に、全部行きます。
$ find ./dir -name '*.html' | xargs perl del_script.pl
はい、これで完了しました!!
こんなの、手作業で直してたら、気が狂うわ。
参考にした所
- http://yoshiiz.blog129.fc2.com/blog-entry-382.html
- http://d.hatena.ne.jp/metalglue/20100126/1264492726
コメント
コメントを投稿
励みになりますので、簡単で良いので一言くださいませ。