написал скрипт для проверки fop, которому надо указать директорию xsl c шаблонами
если будут найдены fo:table-cell без fo:block открывает файл на строке закрытия fo:table-cel (для редактирования через Vi)
позволяет оперативно проверить все шаблоны XSL
Код:
#!/usr/bin/perl
# j4ck, 2012
use strict;
my $dir = $ARGV[0];
die("Укажите директорию для проверки") unless (($dir) || (-e $dir));
sub check_file() {
my $cell_found = 0;
my $block_found = 0;
my $block_ok = 0;
my @err = ();
my $num = 1;
my $file = $_[0];
open MF, "<", $file or die($!);
while(<MF>){
if(/\<fo\:table\-cell/){
$cell_found = 1;
print "[$num] <fo:table-cell>\n" if $ARGV[1];
$num++;
next;
}
if(/\<\/fo\:table\-cell\>/){
if( $block_found ==0 && $block_ok == 0) {
print "[!] Строка $num: внутри fo:table-cell нет fo:block\n" if ( $block_found ==0 && $block_ok == 0);
push(@err,$num);
}
$cell_found = 0;
$block_found = 0;
$block_ok = 0;
print "[$num] </fo:table-cell>\n" if $ARGV[1];
}
if($cell_found == 1){
if(/\<fo\:table\-cell\/\>/) {
$cell_found = 0;
$num++;
next;
}
if((/\<fo\:block\>/) || (/\<fo\:block\/\>/)){
print "[$num] <fo:block>\n" if $ARGV[1];
$block_found = 1;
$num++;
next;
}
if(/\<fo\:block.+(\/)?\>(.+)?\<\/fo\:block\>/){
print "[$num] <fo:block></fo:block>\n" if $ARGV[1];
$block_found = 1;
$num++;
next;
}
if(/\<\/fo\:block\>/){
print "[$num] </fo:block>\n" if $ARGV[1];
$block_found = 1;
$block_ok = 1;
$num++;
next;
}
if($block_found) {
if((/\<\/fo\:block\>/) || /\<fo\:block\/\>/) {
print "[$num] </fo:block>\n" if $ARGV[1];
$block_ok = 1;
$block_found = 0;
$num++;
next;
}
}
if(/\<\/fo\:table\-cell\>/){
$cell_found = 0;
$block_found = 0;
$block_ok = 0;
print "[$num] </fo:table-cell>\n" if $ARGV[1];
}
}
$num++;
}
if($#err > 0) {
print " Редактировать построчно? (yes/no): ";
while(<STDIN>) {
last if /^yes$/;
return if /^no$/;
}
for(@err) {
my $str = $_;
system("vi +$str $file");
}
}
}
sub list_dir() {
opendir my($dh), $dir or die "Couldn't open dir '$dir': $!";
my @files = readdir $dh;
for(@files){
next unless /\.xsl/;
my $curr = $_;
print "[~] Проверка файла $curr\n";
&check_file($curr);
}
}
sub main {
&list_dir;
}
main;