1. perl - HTML のチェック・編集 - HTML の要素をチェックする

 
1.1 概要
1.2 HTML の要素をチェックする

1.1 概要

 やりたいことが以降の項目と前後してしまうのですが・・・。  本サイトで

<dl class="bodycontents">
<dt><a href="...">・・・     </a></dt>
<dt><a href="...">・・・     </a></dt>
</dl>
 と書いてある .html が大量にあるのですが。  .css を変更した事情で、これを

<dl class="bodycontents">
<a href="..."><dt>・・・     </dt></a>
<a href="..."><dt>・・・     </dt></a>
</dl>
 という並びに書き換えたいのです。  でまぁ、そのようにすることはできたのですが・・・。  実は

<dl class="bodycontents">
<dt><a href="...">・・・     </a>
<dt><a href="...">・・・     </a>
</dl>
 と書いてある箇所があって、これがうまく動作してくれないのです。  てっきり、タグが閉じてないのは、.html のエディタの方で警告が出るものだと思っていたのですが・・・。  <dt> は閉じなくても、次の <dt> 要素が出現するか、</dl> があれば項目の終わりがブラウザで判断できるため、警告は出ないことになっているのでした。  エディタの文法チェックの方を変更したいのですが、そのやり方がわからないため、閉じていない <dt> をチェックするスクリプトを作成することにしました。

1.2 HTML の要素をチェックする

 で、できたソースがこれ

#!/usr/local/bin/perl

use strict;
use FileList;

use constant true  => 1;
use constant false => 0;
use constant ext => 'html';

sub main
{
	my @argv = @_;
	my $root = $argv[0];

	my $list = FileList->new();

	my $filelist = $list->get($root, ext);

	foreach my $name (sort(@$filelist))
	{
		my $result = check($name);

		if ($result == true)
		{
			print "$name \n";
		}
	}
}

sub check
{
	my ($name) = @_;
	my $fh = IO::File->new();

	$fh->open($name, "r") or die "$!";								#	読込オープン
	my @read = <$fh>;												#	読込
	$fh->close();													#	クローズ

	my $ng = false;
	my @write = undef;

	foreach my $line(@read)
	{
		if ($line =~ /<dt>/)										#	<dt>	を含む行
		{
			if ($line !~ /<\/dt>/)									#	</dt>	を含まない
			{
				$ng = true;
				last;
			}
		}
	}

	return $ng;
}

main(@ARGV);
 FileList に関しては「クラスライブラリ」をご参照ください。  正常な場合は <dt> ~ </dt> の文字列が1行に収まっていなければならないという制約がありますがきっちり動きます。  もう少し文法に詳しければ、もっとスマートな書き方があるはずですが・・・

> perl ソースファイル.pl ディレクトリ
 で動作します。