HTML整形
選択中のHTMLを整形するマクロです。
PerlScriptで動作します。
(jsee,vbeeなど、ほかの言語への移植歓迎します。)
2006.11.10 対応タグを大幅に増やしました。
#language="PerlScript"
my $src = $Window->document->selection->Text;
my ($indent) = $src =~ /^([ \t]+)</g;
$indent =~ s/\t/ /g;
$indent = ( length $indent ) / 2;
$src =~ s/\x0D\x0A/\n/g;
$src =~ tr/\x0D\x0A/\n\n/;
my (@rep);
map { $src =~ s/($_)/{push @rep, $1;"replaceEmMacro[$#rep]"}/eigs; } (
q{<SCRIPT.*?<\/SCRIPT>}, q{<PRE.*?<\/PRE>},
q{<STYLE.*?<\/STYLE>}, q{<EMBED.*?<\/EMBED>},
q{<TEXTAREA.*?<\/TEXTAREA>}, q{<\!\-\-.*?\-\->},
);
map { $src =~ s/[ \t]*(<$_.*?>)\s*/$1\n/gsi } (
'\!DOCTYPE', 'HTML', 'HEAD', 'META', 'LINK', 'BODY',
'TABLE', 'TBODY', 'COL', 'TR', 'FORM', 'SELECT',
'BR', 'HR', 'CENTER', 'FRAMESET', 'FRAME', 'MAP',
'NOSCRIPT'
);
map { $src =~ s/[ \t]*(<$_.*?>)\s*/$1/gsi } ( 'TH', 'TD' );
map { $src =~ s/[ \t]*(<\/$_>)\s*/$1\n/gsi } (
'HTML', 'HEAD', 'TITLE', 'BODY', 'TABLE', 'TBODY',
'TR', 'TH', 'TD', 'FORM', 'SELECT', 'OPTION',
'P', 'h\d', 'CENTER', 'DIV', 'FRAMESET', 'FRAME',
'MAP', 'UL', 'LI', 'NOSCRIPT'
);
map { $src =~ s/[ \t]*(<$_.*?>)/\n$1/gsi }
( 'TABLE', 'P', 'h\d', 'DIV', 'INPUT', 'FRAMESET', 'MAP', 'UL', 'LI' );
$src =~ s/^[ \t]+//gm;
$src =~ tr/\n//s;
my $output;
for my $line ( split( /\n/, $src ) ) {
if ( $line =~ /<(TABLE|TBODY|TR|FRAMESET|MAP|UL)/i ) { # >
$output .= " " x $indent;
$indent++;
}
elsif ( $line =~ /<\/(TABLE|TBODY|TR|FRAMESET|MAP|UL)/i ) { # >
$indent--;
$output .= " " x $indent;
}
else {
$output .= " " x $indent;
}
$output .= "$line\n";
}
for my $i ( 0 .. $#rep ) {
my $j = $#rep - $i;
$output =~ s/replaceEmMacro\[$j\]/$rep[$j]/e;
}
$Window->document->Write($output);