Могу ли я использовать HTML-форматер perltidy в моей автоматической сборке Perl? - PullRequest
1 голос
/ 07 мая 2009

Я использую 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 ]

1 голос
/ 09 мая 2009

Очень просто определить новые действия Module :: Build, которые вы можете вызывать с помощью dispatch, и в документации Module :: Build есть множество примеров. Определите действие для обработки вашего нового шага:

sub ACTION_htmltidy
    {
    my( $self ) = @_;

    $self->depends_on( ...other targets... );

    require Perl::Tidy;

    ...do your damage...
    }

Если вы хотите, чтобы другое действие использовало ваше, вы можете расширить его, чтобы создать зависимость:

sub ACTION_install
    {
    my( $self ) = @_;

    $self->depends_on( 'htmltidy' );

    $self->SUPER::install;
    }
1 голос
/ 07 мая 2009

Ну, действие реализовано в

htmlify_pods

in Модуль :: Сборка :: База .

Должна быть возможность переопределить этот метод.

Намного позже ...

Вот моя попытка (проверена только один раз):

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;
...