App-Music-ChordPro
view release on metacpan or search on metacpan
lib/ChordPro/Output/PDF.pm view on Meta::CPAN
sub diagrammer {
my ( $type ) = @_;
my $p;
if ( $type eq "keyboard" ) {
require ChordPro::Output::PDF::KeyboardDiagram;
$p = ChordPro::Output::PDF::KeyboardDiagram->new( pr => $pr );
}
else {
require ChordPro::Output::PDF::StringDiagram;
$p = ChordPro::Output::PDF::StringDiagram->new( pr => $pr );
}
return $p;
}
use Object::Pad;
class TextLayoutImageElement :isa(Text::Layout::PDFAPI2::ImageElement);
use Carp;
use Text::ParseWords qw( shellwords );
method parse( $ctx, $k, $v ) {
my %ctl = ( type => "img", %$ctx );
my $err;
# Split the attributes.
foreach my $kk ( shellwords($v) ) {
# key=value
if ( $kk =~ /^([-\w]+)=(.+)$/ ) {
my ( $k, $v ) = ( $1, $2 );
# Ignore case unless required.
$v = lc $v unless $k =~ /^(id|chord|src)$/;
if ( $k =~ /^(chord|src)$/ ) {
if ( $v =~ /^(chord|builtin):/ ) {
$k = $1;
$v = $';
}
$ctl{$k} = $v;
}
elsif ( $k =~ /^(id|bbox)$/ ) {
$ctl{$k} = $v;
}
elsif ( $k eq "align" && $v =~ /^(left|right|center)$/ ) {
$ctl{$k} = $v;
}
elsif ( $k eq "type" && $v =~ /^(strings?|keyboard)$/ ) {
$ctl{instrument} = $v;
}
elsif ( $k =~ /^(width|height|dx|dy|w|h)$/ ) {
$v = $1 if $v =~ /^(-?[\d.]+)pt$/;
$v = $1 * $ctx->{size} if $v =~ /^(-?[\d.]+)em$/;
$v = $1 * $ctx->{size} / 2 if $v =~ /^(-?[\d.]+)ex$/;
#$v = $1 * $ctx->{size} / 100 if $v =~ /^(-?[\d.]+)\%$/;
if ( $v =~ /^(-?[\d.]+)\%$/ ) {
warn("Invalid img attribute: \"$kk\" (percentage not allowed)\n");
$err++;
}
else {
$ctl{$k} = $v;
}
}
elsif ( $k =~ /^(scale)$/ ) {
my @s;
for ( split( /,/, $v ) ) {
$_ = $1 / 100 if /^([\d.]+)\%$/;
push( @s, $_ );
}
push( @s, $s[0] ) unless @s > 1;
unless ( @s == 2 ) {
warn("Invalid img attribute: \"$kk\" (too many values)\n");
$err++;
}
$ctl{$k} = \@s;
}
else {
warn("Invalid img attribute: \"$k\" ($kk)\n");
$err++;
}
}
# Currently we do not have value-less attributes.
else {
warn("Invalid img attribute: \"$kk\"\n");
$err++;
}
}
if ( $err ) {
if ( $ctl{id} ) {
$ctl{id} = "__ERROR__";
}
}
elsif ( $ctl{id} ) {
my $a = ChordPro::Output::PDF::Song::assets($ctl{id});
if ( $a && $a->{opts}->{base} ) {
$ctl{base} = $a->{opts}->{base};
}
}
return \%ctl;
}
method getimage ($fragment) {
$fragment->{_img} //= do {
my $xo;
if ( $fragment->{id} ) {
my $o = ChordPro::Output::PDF::Song::assets($fragment->{id});
$xo = $o->{data} if $o;
unless ( $o && $xo ) {
warn("Unknown image ID in <img>: $fragment->{id}\n")
unless $fragment->{id} eq "__ERROR__";
$xo = alert( $fragment->{size} );
}
$fragment->{design_scale} = $o->{opts}->{scale};
if ( $o->{width} && $o->{vwidth} ) {
( run in 4.744 seconds using v1.01-cache-2.11-cpan-437f7b0c052 )