Gimp
view release on metacpan or search on metacpan
lib/Gimp/Pod.pm view on Meta::CPAN
}
sub _cache {
my $self = shift;
return $self->{doc} if $self->{doc};
$self->{doc} = Pod::Simple::SimpleTree->new->parse_file($self->{path})->root;
}
sub sections {
my ($self, $sub) = @_;
my $doc = $self->_cache;
if (defined $sub) {
my $i = 2; # skip 'Document' and initial attrs
$i++ until
$i >= @$doc or ($doc->[$i]->[0] eq 'head1' and $doc->[$i]->[2] eq $sub);
return if $i >= @$doc;
my $i2 = ++$i;
$i2++ until $i2 >= @$doc or $doc->[$i2]->[0] =~ /^head1/;
$i2--;
map { $_->[2] } grep { ref and $_->[0] eq 'head2' } @{$doc}[$i..$i2];
} else {
map $_->[2], grep { ref eq 'ARRAY' and $_->[0] eq 'head1' } @$doc;
}
}
sub _flatten_para {
my $para = shift;
join '', map { ref($_) ? _flatten_para($_) : $_ } @{$para}[2..$#{$para}];
}
sub section {
my $self = shift;
warn "$$-".__PACKAGE__."::section(@_)" if $Gimp::verbose >= 2;
return unless defined(my $doc = $self->_cache);
my $i = 2; # skip 'Document' and initial attrs
my $depth = 0;
while (defined(my $sec = shift)) {
$depth++;
$i++ until
$i >= @$doc or
($doc->[$i]->[0] eq "head$depth" and $doc->[$i]->[2] eq $sec);
return if $i >= @$doc;
}
my $i2 = ++$i;
$i2++ until $i2 >= @$doc or $doc->[$i2]->[0] =~ /^head/;
$i2--;
my $text = join "\n\n", map { _flatten_para($_) } @{$doc}[$i..$i2];
warn "$$-".__PACKAGE__."::section returning '$text'" if $Gimp::verbose >= 2;
$text;
}
sub lazy_image_params { ([&Gimp::PDB_IMAGE, "image", "Input image"],
[&Gimp::PDB_DRAWABLE, "drawable", "Input drawable", '%a']); }
sub lazy_load_params { ([&Gimp::PDB_STRING, "filename", "Filename"],
[&Gimp::PDB_STRING, "raw_filename", "User-given filename"]); }
sub lazy_save_params { (&lazy_image_params, &lazy_load_params); }
sub lazy_image_retval { [&Gimp::PDB_IMAGE, "image", "Output image"]; }
sub insert_params {
my @p = @_;
die __<<EOF unless $p[6] =~ /^<(?:Image|Load|Save|Toolbox|None)>/;
Menupath must start with <Image>, <Load>, <Save>, <Toolbox>, or <None>!
(got '$p[6]')
EOF
if ($p[6] =~ /^<Image>\//) {
if ($p[7]) {
unshift @{$p[8]}, &lazy_image_params;
} else {
# undef or ''
unshift @{$p[9]}, &lazy_image_retval
if !@{$p[9]} or $p[9]->[0]->[0] != &Gimp::PDB_IMAGE;
}
} elsif ($p[6] =~ /^<Load>\//) {
my ($start, $label, $fileext, $prefix) = split '/', $p[6];
$prefix = '' unless $prefix;
Gimp::on_query { Gimp->register_load_handler($p[0], $fileext, $prefix); };
$p[6] = join '/', $start, $label;
unshift @{$p[8]}, &lazy_load_params;
unshift @{$p[9]}, &lazy_image_retval;
} elsif ($p[6] =~ /^<Save>\/(.*)/) {
my ($start, $label, $fileext, $prefix) = split '/', $p[6];
$prefix = '' unless $prefix;
Gimp::on_query { Gimp->register_save_handler($p[0], $fileext, $prefix); };
$p[6] = join '/', $start, $label;
unshift @{$p[8]}, &lazy_save_params;
} elsif ($p[6] =~ m#^<Toolbox>/Xtns/#) {
undef $p[7];
} elsif ($p[6] =~ /^<None>/) {
undef $p[6]; undef $p[7];
}
@p;
}
my %IND2SECT = (
2 => 'DESCRIPTION', 3 => 'AUTHOR', 4 => 'LICENSE',
5 => 'DATE', 6 => 'SYNOPSIS', 7 => 'IMAGE TYPES',
8 => 'PARAMETERS', 9 => 'RETURN VALUES',
);
sub _getpod { $_[0] ||= new __PACKAGE__; $_[0]->section($_[1]); }
sub _patchup_eval ($$) {
my ($label, $text) = @_;
no strict;
my @result = eval "package main;\n#line 0 \"$0 $label\"\n" . ($text // '');
die $@ if $@;
@result;
}
sub fixup_args {
my @p = @_;
my $pod;
splice @p, 9, 0, '' if @p == 10;
croak sprintf
__"register given wrong number of arguments: wanted 11, got %d(%s)",
scalar(@p),
join(' ', @p),
unless @p == 11;
@p[0,1] = (_getpod($pod,'NAME')//'') =~ /(.*?)\s*-\s*(.*)/ unless $p[0] or $p[1];
($p[0]) = File::Basename::fileparse($RealScript, qr/\.[^.]*/) unless $p[0];
while (my ($k, $v) = each %IND2SECT) { $p[$k] ||= _getpod($pod, $v); }
for my $i (8, 9) {
my $s = $IND2SECT{$i};
$p[$i] = $p[$i] ? ref $p[$i] ? $p[$i] : [ _patchup_eval $s, $p[$i] ] : [];
}
( run in 0.739 second using v1.01-cache-2.11-cpan-39bf76dae61 )