Могу ли я использовать HTML-форматер perltidy в моей автоматической сборке Perl?
Я использую Module::Build для выполнения действий по сборке, тестированию, testpod, html и установке моего разрабатываемого модуля Perl. Сгенерированные HTML-файлы в порядке, но я был бы намного счастливее, если бы мог каким-то образом настроить Module::Build для использования утилиты форматирования perltidy -html вместо своего собственного средства форматирования HTML.
Кто-нибудь знает, как я могу заменить средство форматирования HTML, которое поставляется с Module::Build, на более красивое средство форматирования HTML?
Приложение: Когда я сказал "заменить" выше, это, вероятно, вводило в заблуждение. Я действительно не хочу писать код, чтобы заменить HTML-форматер, который поставляется с Module::Build. Я действительно хочу знать, есть ли в Module::Build какие-либо другие параметры форматирования HTML. HTML-код, который он генерирует, очень простой и общий. Это так скучно. Мне очень нравится вывод Perltidy.
Вот как у меня это работает прямо сейчас в сценарии сборки, который я написал, но это просто хак... выпадение из сценария командной строки perltidy:
use strict;
use warnings;
# get list of files in directory
my $libLocation = "lib/EDF";
opendir( DIR, $libLocation );
my @filenameArray = readdir(DIR);
# iterate over all files to find *.pm set
for my $file (@filenameArray) {
if ( $file =~ m/ # matching regex
\. # literal period character
pm # the pm file extenstion
/x # end of regex
)
{
my $return = `perl D:/Perl/site/bin/perltidy -q --indent-columns=4 --maximum-line-length=80 -html -opath blib/libhtml2 -toc $libLocation/$file`;
if ($return eq "") {
print "HTMLized " . $file . "\n";
}
else {
print "Error: " . $return . "\n";
}
}
}
Но я очень надеялся, что найдется способ использовать Module::Build и просто указать его с помощью флага, аргумента или чего-то еще, чтобы сказать ему использовать другой форматер HTML. Я думаю, что это несбыточная мечта, хотя:
use strict;
use warnings;
use Module::Build;
my $build = Module::Build->resume (
properties => {
config_dir => '_build',
},
);
$build->dispatch('build');
$build->dispatch('html', engine => 'perltidy');
или, может быть:
$build->dispatch('htmltidy');
2 ответа
Ну, действие реализовано в
htmlify_pods
Должна быть возможность переопределить этот метод.
Много позже...
Вот моя попытка (проверена только один раз):
package My::Builder;
use strict;
use warnings;
use base 'Module::Build';
sub htmlify_pods {
my $self = shift;
my $type = shift;
my $htmldir = shift || File::Spec->catdir($self->blib, "${type}html");
require Module::Build::Base;
require Module::Build::PodParser;
require Perl::Tidy;
$self->add_to_cleanup('pod2htm*');
my $pods = $self->_find_pods(
$self->{properties}{"${type}doc_dirs"},
exclude => [ Module::Build::Base::file_qr('\.(?:bat|com|html)$') ] );
return unless %$pods; # nothing to do
unless ( -d $htmldir ) {
File::Path::mkpath($htmldir, 0, oct(755))
or die "Couldn't mkdir $htmldir: $!";
}
my @rootdirs = ($type eq 'bin') ? qw(bin) :
$self->installdirs eq 'core' ? qw(lib) : qw(site lib);
my $podpath = join ':',
map $_->[1],
grep -e $_->[0],
map [File::Spec->catdir($self->blib, $_), $_],
qw( script lib );
foreach my $pod ( keys %$pods ) {
my ($name, $path) = File::Basename::fileparse($pods->{$pod},
Module::Build::Base::file_qr('\.(?:pm|plx?|pod)$'));
my @dirs = File::Spec->splitdir( File::Spec->canonpath( $path ) );
pop( @dirs ) if $dirs[-1] eq File::Spec->curdir;
my $fulldir = File::Spec->catfile($htmldir, @rootdirs, @dirs);
my $outfile = File::Spec->catfile($fulldir, "${name}.html");
my $infile = File::Spec->abs2rel($pod);
next if $self->up_to_date($infile, $outfile);
unless ( -d $fulldir ){
File::Path::mkpath($fulldir, 0, oct(755))
or die "Couldn't mkdir $fulldir: $!";
}
my $path2root = join( '/', ('..') x (@rootdirs+@dirs) );
my $htmlroot = join( '/',
($path2root,
$self->installdirs eq 'core' ? () : qw(site) ) );
my $fh = IO::File->new($infile) or die "Can't read $infile: $!";
my $abstract = Module::Build::PodParser->new(fh => $fh)->get_abstract();
my $title = join( '::', (@dirs, $name) );
$title .= " - $abstract" if $abstract;
my %opts = (
argv => join(" ",
qw( -html --podflush ),
"--title=$title",
'--podroot='.$self->blib,
"--htmlroot=$htmlroot",
"--podpath=$podpath",
),
source => $infile,
destination => $outfile,
);
if ( eval{Pod::Html->VERSION(1.03)} ) {
$opts{argv} .= ' --podheader';
$opts{argv} .= ' --backlink=Back to Top';
if ( $self->html_css ) {
$opts{argv} .= " --css=$path2root/" . $self->html_css;
}
}
$self->log_info("HTMLifying $infile -> $outfile\n");
$self->log_verbose("perltidy %opts\n");
Perl::Tidy::perltidy(%opts); # or warn "pod2html @opts failed: $!";
}
}
1;
** Чтобы использовать это.. **
#!/usr/bin/perl
use strict;
use warnings;
use My::Builder;
my $builder = My::Builder->new(
module_name => 'My::Test',
license => 'perl',
);
$builder->create_build_script;
Очень просто определить новые действия Module::Build, которые вы можете вызывать с помощью dispatch, и в документации Module::Build есть множество примеров. Определите действие для обработки вашего нового шага:
sub ACTION_htmltidy { my ($ self) = @_; $ self-> depen_on( ... другие цели...); требуют Perl::Tidy; ... нанести ущерб... }
Если вы хотите, чтобы другое действие использовало ваше, вы можете расширить его, чтобы создать зависимость:
sub ACTION_install {my ($ self) = @_; $ self-> depen_on( 'htmltidy'); $ Self->SUPER:: установки; }