App-Music-ChordPro
view release on metacpan or search on metacpan
lib/ChordPro/Output/PDF/Song.pm view on Meta::CPAN
$chordsx,
$ytext + $ftext->{size} *
$ps->{spacing}->{chords},
$fonts->{chord} );
undef $chordscapo;
}
# Underline the first word of the phrase, to indicate
# the actual chord position. Skip leading non-letters.
$phrase = " " if $phrase eq "";
# This may screw up in some markup situations.
my ( $pre, $word, $rest ) =
$phrase =~ /^((?:\<[^>]*?\>|\W)+)?(\w+)(.+)?$/;
# This should take case of most cases...
unless ( $i == $n || defined($rest) && $rest !~ /^\</ ) {
$rest = chop($word) . ($rest//"");
}
$phrase = ($pre//"") . "<u>" . $word . "</u>" . ($rest//"");
# Print the text.
pr_label_maybe( $ps, $x, $ytext );
$x = $pr->text( $phrase, $x, $ytext, $ftext );
# Collect chords to be printed in the side column.
$chord = $chord->chord_display;
push( @chords, $chord );
}
else {
my $xt0 = $x;
my $font = $fchord;
if ( $chord ne '' ) {
my $ch = $chord->chord_display;
my $dp = $ch . " ";
if ( $chord->info->is_annotation ) {
$font = $fonts->{annotation};
( $dp = $inlineannots ) =~ s/%[cs]/$ch/g
if $inlinechords;
}
elsif ( $inlinechords ) {
( $dp = $inlinechords ) =~ s/%[cs]/$ch/g;
}
$xt0 = $pr->text( $dp, $x, $ychord, $font );
}
# Do not indent chorus labels (issue #81).
pr_label_maybe( $ps, $x-$opts{indent}, $ytext );
if ( $inlinechords ) {
$x = $pr->text( $phrase, $xt0, $ytext, $ftext );
}
else {
my $xt1;
if ( $phrase =~ /^\s+$/ ) {
$xt1 = $xt0 + length($phrase) * $pr->strwidth(" ",$ftext);
# $xt1 = $pr->text( "n" x length($phrase), $xt0, $ytext, $ftext );
}
else {
$xt1 = $pr->text( $phrase, $x, $ytext, $ftext );
}
if ( $xt0 > $xt1 ) { # chord is wider
# Do we need to insert a split marker?
if ( $i < $n
&& demarkup($phrase) !~ /\s$/
&& demarkup($phrases[$i+1]) !~ /^\s/
# And do we have one?
&& ( my $marker = $ps->{'split-marker'} ) ) {
# Marker has 3 parts: start, repeat, and final.
# final is always printed, last.
# start is printed if there is enough room.
# repeat is printed repeatedly to fill the rest.
$marker = [ $marker, "", "" ]
unless is_arrayref($marker);
# Reserve space for final.
my $w = 0;
$pr->setfont($ftext);
$w = $pr->strwidth($marker->[2]) if $marker->[2];
$xt0 -= $w;
# start or repeat (if no start).
my $m = $marker->[0] || $marker->[1];
$x = $xt1;
$x = $xt0 unless $m;
while ( $x < $xt0 ) {
$x = $pr->text( $m, $x, $ytext, $ftext );
# After the first, use repeat.
$m = $marker->[1];
$x = $xt0, last unless $m;
}
# Print final.
if ( $w ) {
$x = $pr->text( $marker->[2], $x, $ytext, $ftext );
}
}
# Adjust the position for the chord and spit marker width.
$x = $xt0 if $xt0 > $x;
}
else {
# Use lyrics width.
$x = $xt1;
}
}
}
}
# Print side column with chords, if any.
$pr->text( join(", ", @chords),
$chordsx, $ychord, $fchord )
if @chords;
return;
}
sub imageline_vsp {
}
sub imageline {
my ( $elt, $x, $ps, $gety ) = @_;
my $x0 = $x;
my $pr = $ps->{pr};
( run in 1.436 second using v1.01-cache-2.11-cpan-39bf76dae61 )