App-Music-ChordPro
view release on metacpan or search on metacpan
lib/ChordPro/Output/Markdown.pm view on Meta::CPAN
}
\@new;
}
sub generate_song {
my ( $s ) = @_;
$act_song = $s;
$tidy = $options->{'backend-option'}->{tidy};
$single_space = $options->{'single-space'};
upd_config();
# asume songline a verse when no context is applied. # check https://github.com/ChordPro/chordpro/pull/211
foreach my $item ( @{ $s->{body} } ) {
if ( $item->{type} eq "songline" && $item->{context} eq '' ){
$item->{context} = 'verse';
}} # end of pull --
$s->structurize;
my @s;
push(@s, "# " . $s->{title}) if defined $s->{title};
if ( defined $s->{subtitle} ) {
push(@s, map { +"## $_" } @{$s->{subtitle}});
}
if ( !$lyrics_only ){
my $all_chords = "";
# https://chordgenerator.net/D.png?p=xx0212&s=2 # reuse of other projects (https://github.com/einaregilsson/ChordImageGenerator)?
# generate png-out of this project? // fingers also possible - but not set in basics.
foreach my $mchord (@{$s->{chords}->{chords}}){
# replace -1 with 'x' - alternative '-'
my $frets = join("", map { if($_ eq '-1'){ $_ = 'x'; } +"$_"} @{$s->{chordsinfo}->{$mchord}->{frets}});
$all_chords .= " ";
}
push(@s, $all_chords);
push(@s, "");
}
push(@s, elt_handler($s->{body}));
return \@s;
}
sub line_default {
my ( $lineobject, $ref_lineobjects ) = @_;
return "";
}
$line_routines{line_default} = \&line_default;
sub chord {
my ( $c ) = @_;
return "" unless length($c);
return $c->key if $c->info->is_annotation;
$text_layout->set_markup($c->chord_display);
return $text_layout->render;
}
sub md_textline{
my ( $songline ) = @_;
my $empty = $songline;
my $textline = $songline;
my $nbsp = "\x{00A0}"; #unicode for nbsp sign
if($empty =~ /^\s+/){ # starts with spaces
$empty =~ s/^(\s+).*$/$1/; # not the elegant solution - but working - replace all spaces in the beginning of a line
my $replaces = $empty; #with a nbsp symbol as the intend tend to be intentional
$replaces =~ s/\s/$nbsp/g;
$textline =~ s/$empty/$replaces/;
}
$textline = $textline." "; # append two spaces to force linebreak in Markdown
return $textline;
}
sub line_songline {
my ( $elt ) = @_;
my $t_line = "";
my @phrases = map { $text_layout->set_markup($_); $text_layout->render }
@{ $elt->{phrases} };
if ( $lyrics_only or
$single_space && ! ( $elt->{chords} && join( "", map { $_->raw } @{ $elt->{chords} } ) =~ /\S/ )
) {
$t_line = join( "", @phrases );
return md_textline($cp.$t_line);
}
unless ( $elt->{chords} ) { # i guess we have a line with no chords now...
return ($cp. md_textline( join( " ", @phrases )) );
}
if ( my $f = $::config->{settings}->{'inline-chords'} ) {
$f = '[%s]' unless $f =~ /^[^%]*\%s[^%]*$/;
$f .= '%s';
foreach ( 0..$#{$elt->{chords}} ) {
$t_line .= sprintf( $f,
chord( $elt->{chords}->[$_]->raw ),
$phrases[$_] );
}
return ( md_textline($cp.$t_line) );
}
my $c_line = "";
foreach ( 0..$#{$elt->{chords}} ) {
$c_line .= chord( $elt->{chords}->[$_] ) . " ";
$t_line .= $phrases[$_];
my $d = length($c_line) - length($t_line);
$t_line .= "-" x $d if $d > 0;
$c_line .= " " x -$d if $d < 0;
} # this looks like setting the chords above the words.
s/\s+$// for ( $t_line, $c_line );
# main problem in markdown - a fixed position is only available in "Code escapes" so weather to set
# a tab or a double backticks (``) - i tend to the tab - so all lines with tabs are "together"
if ($c_line ne ""){ # Block-lines are not replacing initial spaces - as the are "code"
$t_line = $cp.$t_line." ";
$c_line = $cp.$c_line." ";
}
else{
$t_line = md_textline($cp.$t_line);
}
return $chords_under
? ( $t_line, $c_line )
( run in 0.604 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )