From 7562a64ae3cdc4710693546b47804ad8cf2bfac3 Mon Sep 17 00:00:00 2001 From: Johan Vromans Date: Sun, 31 Dec 2023 15:52:58 +0100 Subject: [PATCH 01/16] Post-release typo fixes. --- Changes | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Changes b/Changes index 1a8e7e69..9c253a43 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,7 @@ +0.000 + + - Post-release typo fixes. + 6.040 2023-12-26 - !Highlights @@ -6,13 +10,13 @@ They can be placed relative to the paper, the page, the column, and the lyrics. - - Images can be [embedded[(https://chordpro.org/chordpro/directives-image/#inline-images) in text (lyrics) lines, either as part of + - Images can be [embedded](https://chordpro.org/chordpro/directives-image/#inline-images) in text (lyrics) lines, either as part of the text similar to a glyph, or somewhere else on the page relative to a particular place in the text. The latter is most interesting for annotations. - - Delegates are images too. Annotate your lyrics with SVG images, - or with musical notes using ABC or Lilypond. + - Delegates are images too. Annotate your lyrics with SVG images + and musical notes using ABC or Lilypond. - Chord and keyboard diagrams are images too. And you can use string and keyboard diagrams simultaneously. From 087132165d0520e5a523b66f2bbb9ba062aa6b42 Mon Sep 17 00:00:00 2001 From: Johan Vromans Date: Sun, 31 Dec 2023 16:20:15 +0100 Subject: [PATCH 02/16] (MMA) Fix warning with perl >= 5.39.6. --- lib/ChordPro/Output/MMA.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ChordPro/Output/MMA.pm b/lib/ChordPro/Output/MMA.pm index 978fabe5..ba92efe0 100644 --- a/lib/ChordPro/Output/MMA.pm +++ b/lib/ChordPro/Output/MMA.pm @@ -37,7 +37,7 @@ my $chords_under = 0; # chords under lyrics sub safemeta { my ( $s, $meta, $default ) = @_; - return $default undef unless defined $meta && defined $s->{meta}->{$meta}; + return $default unless defined $meta && defined $s->{meta}->{$meta}; return $s->{meta}->{$meta}->[0]; } From cda2e2a5a55bf778d7aa1bd73497d130385a9cd1 Mon Sep 17 00:00:00 2001 From: Johan Vromans Date: Sun, 31 Dec 2023 17:25:23 +0100 Subject: [PATCH 03/16] (Stringdiagram) Fix font size of base fret numeral (issue 337). --- Changes | 3 +++ lib/ChordPro/Output/PDF/StringDiagram.pm | 2 +- lib/ChordPro/Version.pm | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Changes b/Changes index 9c253a43..11e16a2f 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,9 @@ 0.000 + - !Bug fixes - Post-release typo fixes. + - (Stringdiagram) Fix font size of base fret numeral (issue 337). + - (MMA) Fix test fail with perl >= 5.39.6. 6.040 2023-12-26 diff --git a/lib/ChordPro/Output/PDF/StringDiagram.pm b/lib/ChordPro/Output/PDF/StringDiagram.pm index 43dd1971..c7103d18 100644 --- a/lib/ChordPro/Output/PDF/StringDiagram.pm +++ b/lib/ChordPro/Output/PDF/StringDiagram.pm @@ -139,7 +139,7 @@ method diagram_xo( $info ) { if ( $basefretno > 1 ) { $basefont = $ps->{fonts}->{diagram_base}->{fd}->{font}; - $basesize = $ps->{spacing}->{diagramchords}*$gh; + $basesize = $gh; $bb[0] -= $basefont->width("$basefretno ") * $basesize; } else { diff --git a/lib/ChordPro/Version.pm b/lib/ChordPro/Version.pm index acbca98f..8b694b93 100644 --- a/lib/ChordPro/Version.pm +++ b/lib/ChordPro/Version.pm @@ -1,4 +1,4 @@ # This file is generated. Do not edit! package ChordPro::Version; -our $VERSION = "6.040"; +our $VERSION = "6.040_001"; print "$VERSION\n" unless caller; From 78affb959d14966a8cef1d427c5075251300647f Mon Sep 17 00:00:00 2001 From: Johan Vromans Date: Tue, 2 Jan 2024 10:05:43 +0100 Subject: [PATCH 04/16] (Stringdiagram) Fix fret number colours. --- Changes | 1 + lib/ChordPro/Output/PDF/StringDiagram.pm | 25 +++++++++++++----------- lib/ChordPro/Version.pm | 2 +- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Changes b/Changes index 11e16a2f..571f71f0 100644 --- a/Changes +++ b/Changes @@ -3,6 +3,7 @@ - !Bug fixes - Post-release typo fixes. - (Stringdiagram) Fix font size of base fret numeral (issue 337). + - (Stringdiagram) Fix fret number colours. - (MMA) Fix test fail with perl >= 5.39.6. 6.040 2023-12-26 diff --git a/lib/ChordPro/Output/PDF/StringDiagram.pm b/lib/ChordPro/Output/PDF/StringDiagram.pm index c7103d18..5947a08e 100644 --- a/lib/ChordPro/Output/PDF/StringDiagram.pm +++ b/lib/ChordPro/Output/PDF/StringDiagram.pm @@ -231,6 +231,19 @@ method diagram_xo( $info ) { my $oflo; # to detect out of range frets + # Color of the dots and numbers. + my $fbg = ""; # numbers + my $ffg = ""; # dots + unless ( $fsh eq "below" ) { + # The numbercolor property of the chordfingers is used for the + # color of the dot numbers. + my $fcf = $ps->{fonts}->{chordfingers}; + $fbg = $pr->_bgcolor($fcf->{numbercolor}); + $ffg = $pr->_bgcolor($fcf->{color}); + # However, if none we should really use white. + $fbg = "white" if $fbg eq "none"; + } + $x = -$gw; for my $sx ( 0 .. $strings-1 ) { $x += $gw; @@ -249,6 +262,7 @@ method diagram_xo( $info ) { "Fret position $fret exceeds diagram size $vc\n"); next; } + $xo->fill_color($ffg); $xo->circle( $x, -$nw - ($fret-0.5)*$gh, $dot/2 )->fill; } @@ -270,17 +284,6 @@ method diagram_xo( $info ) { my $size = $dot; my $asc; # space if "below" - # Color of the numbers. - my $fbg = ""; - unless ( $fsh eq "below" ) { - # The numbercolor property of the chordfingers is used for the - # color of the dot numbers. - my $fcf = $ps->{fonts}->{chordfingers}; - $fbg = $pr->_bgcolor($fcf->{numbercolor}); - # However, if none we should really use white. - $fbg = "white" if $fbg eq "none"; - } - $x = -$gw; my $did = 0; for my $sx ( 0 .. $strings-1 ) { diff --git a/lib/ChordPro/Version.pm b/lib/ChordPro/Version.pm index 8b694b93..26a19979 100644 --- a/lib/ChordPro/Version.pm +++ b/lib/ChordPro/Version.pm @@ -1,4 +1,4 @@ # This file is generated. Do not edit! package ChordPro::Version; -our $VERSION = "6.040_001"; +our $VERSION = "6.040_002"; print "$VERSION\n" unless caller; From e474c23710c24fa03f8b22b5ef9ac79c4d0dda43 Mon Sep 17 00:00:00 2001 From: Johan Vromans Date: Tue, 2 Jan 2024 14:40:23 +0100 Subject: [PATCH 05/16] Ignore XDG_CONFIG_HOME if empty; Report XDG_CONFIG_HOME in runtime info. --- Changes | 2 ++ lib/ChordPro.pm | 5 +++++ lib/ChordPro/Paths.pm | 2 +- lib/ChordPro/Version.pm | 2 +- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Changes b/Changes index 571f71f0..ba44c18a 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,7 @@ 0.000 + - !Functionality + - Report XDG_CONFIG_HOME in runtime info. - !Bug fixes - Post-release typo fixes. - (Stringdiagram) Fix font size of base fret numeral (issue 337). diff --git a/lib/ChordPro.pm b/lib/ChordPro.pm index 5c2128fa..da089b19 100644 --- a/lib/ChordPro.pm +++ b/lib/ChordPro.pm @@ -1059,6 +1059,11 @@ sub ::runtimeinfo { push( @p, $cp->display($_) ); } } + for ( qw( XDG_CONFIG_HOME ) ) { + if ( defined($ENV{$_}) && $ENV{$_} ne "" ) { + $msg .= sprintf( $fmt, $_, $cp->display($ENV{$_}) ); + } + } push( @p, map { $cp->display($_) } @{ $cp->resdirs } ); $tag = "Resource path"; for ( uniq(@p) ) { diff --git a/lib/ChordPro/Paths.pm b/lib/ChordPro/Paths.pm index 36041b4d..096210b5 100644 --- a/lib/ChordPro/Paths.pm +++ b/lib/ChordPro/Paths.pm @@ -60,7 +60,7 @@ BUILD { # -d ~/.$app_lc # -d my_dist_config my @try; - if ( defined( $ENV{XDG_CONFIG_HOME} ) ) { + if ( defined( $ENV{XDG_CONFIG_HOME} ) && $ENV{XDG_CONFIG_HOME} ne "" ) { push( @try, catdir( $ENV{XDG_CONFIG_HOME}, ".config", $app_lc ), catdir( $ENV{XDG_CONFIG_HOME}, ".config" ), diff --git a/lib/ChordPro/Version.pm b/lib/ChordPro/Version.pm index 26a19979..c93fe3a6 100644 --- a/lib/ChordPro/Version.pm +++ b/lib/ChordPro/Version.pm @@ -1,4 +1,4 @@ # This file is generated. Do not edit! package ChordPro::Version; -our $VERSION = "6.040_002"; +our $VERSION = "6.040_004"; print "$VERSION\n" unless caller; From 88a59174033e652b62e74a7502b1f971649c3b7b Mon Sep 17 00:00:00 2001 From: Johan Vromans Date: Tue, 2 Jan 2024 20:22:09 +0100 Subject: [PATCH 06/16] Fix handling of XDG_CONFIG_HOME. --- Changes | 1 + lib/ChordPro/Paths.pm | 8 +++++--- lib/ChordPro/Version.pm | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Changes b/Changes index ba44c18a..f524472d 100644 --- a/Changes +++ b/Changes @@ -6,6 +6,7 @@ - Post-release typo fixes. - (Stringdiagram) Fix font size of base fret numeral (issue 337). - (Stringdiagram) Fix fret number colours. + - Fix handling of XDG_CONFIG_HOME. - (MMA) Fix test fail with perl >= 5.39.6. 6.040 2023-12-26 diff --git a/lib/ChordPro/Paths.pm b/lib/ChordPro/Paths.pm index 096210b5..4d0c5f0e 100644 --- a/lib/ChordPro/Paths.pm +++ b/lib/ChordPro/Paths.pm @@ -62,9 +62,11 @@ BUILD { my @try; if ( defined( $ENV{XDG_CONFIG_HOME} ) && $ENV{XDG_CONFIG_HOME} ne "" ) { push( @try, - catdir( $ENV{XDG_CONFIG_HOME}, ".config", $app_lc ), - catdir( $ENV{XDG_CONFIG_HOME}, ".config" ), - catdir( $ENV{XDG_CONFIG_HOME}, ".$app_lc" ) ); + # See https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html + # catdir( $ENV{XDG_CONFIG_HOME}, ".config", $app_lc ), + # catdir( $ENV{XDG_CONFIG_HOME}, ".config" ), + # catdir( $ENV{XDG_CONFIG_HOME}, ".$app_lc" ) ); + catdir( $ENV{XDG_CONFIG_HOME}, "$app_lc" ) ); } else { push( @try, diff --git a/lib/ChordPro/Version.pm b/lib/ChordPro/Version.pm index c93fe3a6..6619c8e4 100644 --- a/lib/ChordPro/Version.pm +++ b/lib/ChordPro/Version.pm @@ -1,4 +1,4 @@ # This file is generated. Do not edit! package ChordPro::Version; -our $VERSION = "6.040_004"; +our $VERSION = "6.040_005"; print "$VERSION\n" unless caller; From 47c7ab119aae034b1b83f0d5cc48ece08aebee6f Mon Sep 17 00:00:00 2001 From: Johan Vromans Date: Wed, 3 Jan 2024 11:12:14 +0100 Subject: [PATCH 07/16] Include 'about' info as PDF metadata. --- Changes | 8 ++++++++ lib/ChordPro/Config.pm | 1 + lib/ChordPro/Output/PDF/Writer.pm | 3 +++ lib/ChordPro/Version.pm | 2 +- lib/ChordPro/res/config/chordpro.json | 1 + lib/ChordPro/res/pod/Config.pod | 1 + 6 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index f524472d..e71a92a7 100644 --- a/Changes +++ b/Changes @@ -1,7 +1,15 @@ 0.000 + - !Highlights + + - To trace problems, the ChordPro 'about' information is included + in the PDF. This should not reveal sensitive information, but in + case this bothers you, you can disable this by setting + debug.runtimeinfo to 0 in the config. + - !Functionality - Report XDG_CONFIG_HOME in runtime info. + - Include 'about' info as PDF metadata. - !Bug fixes - Post-release typo fixes. - (Stringdiagram) Fix font size of base fret numeral (issue 337). diff --git a/lib/ChordPro/Config.pm b/lib/ChordPro/Config.pm index 541422d2..72ea878d 100644 --- a/lib/ChordPro/Config.pm +++ b/lib/ChordPro/Config.pm @@ -1643,6 +1643,7 @@ sub default_config () { // For (debugging (internal use only)). "debug" : { + "runtimeinfo" : 1, "a2crd" : 0, "assets" : 0, "chords" : 0, diff --git a/lib/ChordPro/Output/PDF/Writer.pm b/lib/ChordPro/Output/PDF/Writer.pm index 657f6f91..2c9b2a1c 100644 --- a/lib/ChordPro/Output/PDF/Writer.pm +++ b/lib/ChordPro/Output/PDF/Writer.pm @@ -61,6 +61,9 @@ sub info { for ( keys(%info) ) { $self->{pdf}->info_metadata( $_, demarkup($info{$_}) ); } + if ( $config->{debug}->{runtimeinfo} ) { + $self->{pdf}->info_metadata( "RuntimeInfo", ::runtimeinfo() ); + } } else { $self->{pdf}->info(%info); diff --git a/lib/ChordPro/Version.pm b/lib/ChordPro/Version.pm index 6619c8e4..7a600ba7 100644 --- a/lib/ChordPro/Version.pm +++ b/lib/ChordPro/Version.pm @@ -1,4 +1,4 @@ # This file is generated. Do not edit! package ChordPro::Version; -our $VERSION = "6.040_005"; +our $VERSION = "6.040_006"; print "$VERSION\n" unless caller; diff --git a/lib/ChordPro/res/config/chordpro.json b/lib/ChordPro/res/config/chordpro.json index 8e7757da..3710f6c2 100644 --- a/lib/ChordPro/res/config/chordpro.json +++ b/lib/ChordPro/res/config/chordpro.json @@ -761,6 +761,7 @@ // For (debugging (internal use only)). "debug" : { + "runtimeinfo" : 1, "a2crd" : 0, "assets" : 0, "chords" : 0, diff --git a/lib/ChordPro/res/pod/Config.pod b/lib/ChordPro/res/pod/Config.pod index 3cb0e69f..6c634038 100644 --- a/lib/ChordPro/res/pod/Config.pod +++ b/lib/ChordPro/res/pod/Config.pod @@ -788,6 +788,7 @@ extensive details and examples. // For (debugging (internal use only)). "debug" : { + "runtimeinfo" : 1, "a2crd" : 0, "assets" : 0, "chords" : 0, From 3da8b10fd3be0d07b3dc1b1c958b8efb651ff295 Mon Sep 17 00:00:00 2001 From: Johan Vromans Date: Sun, 7 Jan 2024 16:54:53 +0100 Subject: [PATCH 08/16] (PDF) Fix debug message. --- lib/ChordPro/Output/PDF.pm | 3 ++- lib/ChordPro/Version.pm | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/ChordPro/Output/PDF.pm b/lib/ChordPro/Output/PDF.pm index 3a018480..6ae9b06b 100644 --- a/lib/ChordPro/Output/PDF.pm +++ b/lib/ChordPro/Output/PDF.pm @@ -2828,7 +2828,8 @@ sub prepare_assets { }; warn("Created asset $id ($elt->{subtype}, ", $res->{width}, "x", $res->{height}, ")", - map { " $_=" . $res->{opts}->{$_} } keys( %{$res->{opts}//{}} ), + ( map { " $_=" . $res->{opts}->{$_} } + keys( %{$res->{opts}//{}} ) ), "\n") if $config->{debug}->{images}; } diff --git a/lib/ChordPro/Version.pm b/lib/ChordPro/Version.pm index 7a600ba7..eeba46de 100644 --- a/lib/ChordPro/Version.pm +++ b/lib/ChordPro/Version.pm @@ -1,4 +1,4 @@ # This file is generated. Do not edit! package ChordPro::Version; -our $VERSION = "6.040_006"; +our $VERSION = "6.040_007"; print "$VERSION\n" unless caller; From 1373b318d071f20ba66ce266af9941ac6758f995 Mon Sep 17 00:00:00 2001 From: Johan Vromans Date: Mon, 8 Jan 2024 08:13:50 +0100 Subject: [PATCH 09/16] (Song) More keyword detects for delegates. --- lib/ChordPro/Song.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ChordPro/Song.pm b/lib/ChordPro/Song.pm index 12c8bf50..5669ce2a 100644 --- a/lib/ChordPro/Song.pm +++ b/lib/ChordPro/Song.pm @@ -1266,7 +1266,7 @@ sub directive { $xpose + ($config->{settings}->{transpose}//0 ); } my $kv = {}; - if ( $arg =~ /\b(id|label|scale|split|align|center)=(.+)/ ) { + if ( $arg =~ /\b(id|label|scale|split|spread|width|align|center)=(.+)/ ) { $kv = parse_kv($arg); } else { From aa67ed4225403b0e2dad17cc782cbb4eb2416ec4 Mon Sep 17 00:00:00 2001 From: Johan Vromans Date: Mon, 8 Jan 2024 20:39:48 +0100 Subject: [PATCH 10/16] Use ChordPro font for ABC vocals. --- lib/ChordPro/Config.pm | 1 + lib/ChordPro/res/config/chordpro.json | 1 + lib/ChordPro/res/pod/Config.pod | 1 + 3 files changed, 3 insertions(+) diff --git a/lib/ChordPro/Config.pm b/lib/ChordPro/Config.pm index 72ea878d..73288ae1 100644 --- a/lib/ChordPro/Config.pm +++ b/lib/ChordPro/Config.pm @@ -1127,6 +1127,7 @@ sub default_config () { "preamble" : [ // Use ChordPro fonts for lyrics and chords. "%%textfont pdf.fonts.text", + "%%vocalfont pdf.fonts.text", "%%gchordfont pdf.fonts.chord", ], "preprocess" : { "abc" : [] }, diff --git a/lib/ChordPro/res/config/chordpro.json b/lib/ChordPro/res/config/chordpro.json index 3710f6c2..a91a1268 100644 --- a/lib/ChordPro/res/config/chordpro.json +++ b/lib/ChordPro/res/config/chordpro.json @@ -245,6 +245,7 @@ "preamble" : [ // Use ChordPro fonts for lyrics and chords. "%%textfont pdf.fonts.text", + "%%vocalfont pdf.fonts.text", "%%gchordfont pdf.fonts.chord", ], "preprocess" : { "abc" : [] }, diff --git a/lib/ChordPro/res/pod/Config.pod b/lib/ChordPro/res/pod/Config.pod index 6c634038..a5f4a97c 100644 --- a/lib/ChordPro/res/pod/Config.pod +++ b/lib/ChordPro/res/pod/Config.pod @@ -272,6 +272,7 @@ extensive details and examples. "preamble" : [ // Use ChordPro fonts for lyrics and chords. "%%textfont pdf.fonts.text", + "%%vocalfont pdf.fonts.text", "%%gchordfont pdf.fonts.chord", ], "preprocess" : { "abc" : [] }, From 73b67b1f921513d360d6fab58fca13c91e0eba05 Mon Sep 17 00:00:00 2001 From: Johan Vromans Date: Mon, 8 Jan 2024 21:15:45 +0100 Subject: [PATCH 11/16] Fix 'spread' images. --- Changes | 1 + MANIFEST | 1 + lib/ChordPro/Output/PDF.pm | 74 ++++++++++++----------- lib/ChordPro/res/examples/mollymalone.cho | 40 ++++++++++++ 4 files changed, 82 insertions(+), 34 deletions(-) create mode 100644 lib/ChordPro/res/examples/mollymalone.cho diff --git a/Changes b/Changes index e71a92a7..a8b70d76 100644 --- a/Changes +++ b/Changes @@ -15,6 +15,7 @@ - (Stringdiagram) Fix font size of base fret numeral (issue 337). - (Stringdiagram) Fix fret number colours. - Fix handling of XDG_CONFIG_HOME. + - Fix 'spread' images. - (MMA) Fix test fail with perl >= 5.39.6. 6.040 2023-12-26 diff --git a/MANIFEST b/MANIFEST index b68f1685..54df73d0 100644 --- a/MANIFEST +++ b/MANIFEST @@ -135,6 +135,7 @@ lib/ChordPro/res/config/songbook_latex.json lib/ChordPro/res/config/ukulele-ly.json lib/ChordPro/res/config/ukulele.json lib/ChordPro/res/examples/bgdemo.pdf +lib/ChordPro/res/examples/mollymalone.cho lib/ChordPro/res/examples/swinglow.cho lib/ChordPro/res/fonts/ChordProSymbols.ttf lib/ChordPro/res/icons/chordpro-doc.icns diff --git a/lib/ChordPro/Output/PDF.pm b/lib/ChordPro/Output/PDF.pm index 6ae9b06b..d4a0e8da 100644 --- a/lib/ChordPro/Output/PDF.pm +++ b/lib/ChordPro/Output/PDF.pm @@ -544,11 +544,14 @@ sub generate_song { }; my $col; + my $spreadimage; my $col_adjust = sub { if ( $ps->{columns} <= 1 ) { warn("L=", $ps->{__leftmargin}, ", R=", $ps->{__rightmargin}, + ", T=", $ps->{_top}, + ", S=", $spreadimage//"", "\n") if $config->{debug}->{spacing}; return; } @@ -559,17 +562,19 @@ sub generate_song { + $ps->{columnoffsets}->[$col+1]; $ps->{__rightmargin} -= $ps->{columnspace} if $col < $ps->{columns}-1; + $y = $ps->{_top}; warn("C=$col, L=", $ps->{__leftmargin}, ", R=", $ps->{__rightmargin}, + ", T=", $ps->{_top}, + ", S=", $spreadimage//"", "\n") if $config->{debug}->{spacing}; - $y = $ps->{_top}; $x += $ps->{_indent}; + $y -= $spreadimage if defined($spreadimage) && !ref($spreadimage); }; my $vsp_ignorefirst; my $startpage = $opts->{startpage} || 1; my $thispage = $startpage - 1; - my $spreadimage; # Physical newpage handler. my $newpage = sub { @@ -651,12 +656,8 @@ sub generate_song { $x = $ps->{__leftmargin}; $y = $ps->{_margintop}; $y += $ps->{headspace} if $ps->{'head-first-only'} && $class == 2; - - if ( $spreadimage ) { - $y -= imagespread( $spreadimage, $x, $y, $ps ); - undef $spreadimage; - } $x += $ps->{_indent}; + undef $spreadimage unless ref($spreadimage); $ps->{_top} = $y; $col = 0; $vsp_ignorefirst = 1; @@ -859,13 +860,7 @@ sub generate_song { # prepare_assets( $s, $pr ); - if ( $s->{spreadimage} ) { - $spreadimage = $assets->{$s->{spreadimage}->{id}}; -# { type => "image", -# id => $s->{spreadimage}->{id}, -# opts => { spread => $s->{spreadimage}->{space} } -# }; - } + $spreadimage = $s->{spreadimage}; # Get going. $newpage->(); @@ -905,6 +900,13 @@ sub generate_song { $chorddiagrams->() unless $dctl->{show} eq "below"; # Prepare the assets now we know the page width. prepare_assets( $s, $pr ); + + if ( $spreadimage ) { + if (ref($spreadimage) eq 'HASH' ) { + $spreadimage = imagespread( $spreadimage, $x, $y, $ps ); + } + $y -= $spreadimage; + } showlayout($ps) if $ps->{showlayout} || $config->{debug}->{spacing}; } @@ -1403,21 +1405,22 @@ sub generate_song { # margin* are offsets from the edges of the paper. # _*margin are offsets taking even/odd pages into account. - # _margin* are physical coordinates, taking ... if ( $rightpage ) { $ps->{_leftmargin} = $ps->{marginleft}; - $ps->{_marginleft} = $ps->{marginleft}; $ps->{_rightmargin} = $ps->{marginright}; - $ps->{_marginright} = $ps->{papersize}->[0] - $ps->{marginright}; } else { $ps->{_leftmargin} = $ps->{marginright}; - $ps->{_marginleft} = $ps->{marginright}; $ps->{_rightmargin} = $ps->{marginleft}; - $ps->{_marginright} = $ps->{papersize}->[0] - $ps->{marginleft}; } + + # _margin* are physical coordinates, taking even/odd pages into account. + $ps->{_marginleft} = $ps->{_leftmargin}; + $ps->{_marginright} = $ps->{papersize}->[0] - $ps->{_rightmargin}; $ps->{_marginbottom} = $ps->{marginbottom}; $ps->{_margintop} = $ps->{papersize}->[1] - $ps->{margintop}; + + # Bottom margin, taking bottom chords into account. $ps->{_bottommargin} = $ps->{marginbottom}; # Physical coordinates; will be adjusted to columns if needed. @@ -2015,20 +2018,19 @@ sub imageline { } sub imagespread { - my ( $elt, $x, $y, $ps ) = @_; - ::dump($elt); - my $opts = $elt->{opts}; + my ( $si, $x, $y, $ps ) = @_; my $pr = $ps->{pr}; - my $tag = "id=" . $elt->{opts}->{id}; + my $tag = "id=" . $si->{id}; return "Unknown asset: $tag" - unless exists( $assets->{$elt->{opts}->{id}} ); - my $img = $assets->{$elt->{opts}->{id}}->{data}; + unless exists( $assets->{$si->{id}} ); + my $img = $assets->{$si->{id}}->{data}; return "Unhandled asset: $tag" unless $img; + my $opts = {}; # Available width and height. - my $pw = $ps->{__rightmargin} - $ps->{_leftmargin}; + my $pw = $ps->{_marginright} - $ps->{_marginleft}; my $ph = $ps->{_margintop} - $ps->{_marginbottom}; my $scale = 1; @@ -2090,7 +2092,7 @@ sub imagespread { align => $align, ); - return $h + $elt->{opts}->{spread}; # vertical size + return $h + $si->{space}; # vertical size } sub tocline { @@ -2651,9 +2653,9 @@ sub prepare_assets { # So we first scan the list for SVG and delegate items and turn these # into simple display items. - my $pw = $ps->{__rightmargin} - $ps->{__leftmargin} + my $pw = $ps->{_marginright} - $ps->{_marginleft}; + my $cw = ( $pw - ( $ps->{columns} - 1 ) * $ps->{columnspace} ) /$ps->{columns} - $ps->{_indent}; - my $cw = ( $pw - ( $ps->{columns} - 1 ) * $ps->{columnspace} ) /$ps->{columns}; warn("PDF: Preparing ", scalar(keys %sa), " image", keys(%sa) == 1 ? "" : "s", ", pw=$pw, cw=$cw\n") if $config->{debug}->{images} || $config->{debug}->{assets}; @@ -2665,7 +2667,9 @@ sub prepare_assets { if ( $elt->{type} eq "image" && $elt->{subtype} eq "delegate" ) { my $delegate = $elt->{delegate}; warn("PDF: Preparing delegate $delegate, handler ", - $elt->{handler}, "\n") if $config->{debug}->{images}; + $elt->{handler}, + ( map { " $_=" . $elt->{opts}->{$_} } keys(%{$elt->{opts}//{}})), + "\n") if $config->{debug}->{images}; my $pkg = __PACKAGE__; $pkg =~ s/::Output::[:\w]+$/::Delegate::$delegate/; @@ -2678,18 +2682,20 @@ sub prepare_assets { # Determine actual width. my $w = defined($elt->{opts}->{spread}) ? $pw : $cw; -# $w -= $ps->{_indent}; $w = $elt->{opts}->{width} if $elt->{opts}->{width} && $elt->{opts}->{width} < $w; my $res = $hd->( $s, $w, $elt ); if ( $res ) { + $res->{opts} = { %{ $res->{opts} // {} }, + %{ $elt->{opts} // {} } }; warn( "PDF: Preparing delegate $delegate, handler ", $elt->{handler}, " => ", - $res->{type}, "/", $res->{subtype}, "\n" ) + $res->{type}, "/", $res->{subtype}, + ( map { " $_=" . $res->{opts}->{$_} } keys(%{$res->{opts}//{}})), + " w=$w", + "\n" ) if $config->{debug}->{images}; - $res->{opts} = { %{ $res->{opts} // {} }, - %{ $elt->{opts} // {} } }; $s->{assets}->{$id} = $res; } diff --git a/lib/ChordPro/res/examples/mollymalone.cho b/lib/ChordPro/res/examples/mollymalone.cho new file mode 100644 index 00000000..acb4dcaf --- /dev/null +++ b/lib/ChordPro/res/examples/mollymalone.cho @@ -0,0 +1,40 @@ +{title: Molly Malone} +{subtitle: Irish Traditional} +{artist: Traditional} +{columns 2} +{start_of_abc spread=32 width="700"} +X: 1 +M: 3/4 +L: 1/4 +K: G +D | "G"GGG | "Em"GG"D7"A|"G"G2D| +w: “Cock-les_ and Mus-sels,_ a-live a-live O!” A- +P:Chorus +"G"G>GG|"Em"G/B/-BG|"Am"A>AA|"D7"A/c/-cA/A/|"G"G/d/-dc|"Em"B/d/-d c|"A7"B>G"D7"A|"G"G2z |] +w: live, a-live O!_* A-live a-live O!_* Cry-ing “Cock-les* and Mus-sels* a-live a-live-O!” + +{end_of_abc} +{image anchor="page" x="100%" y="100%" src="https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Dublin_-_Molly_Malone.jpg/270px-Dublin_-_Molly_Malone.jpg"} +{start_of_verse} +She [G]was a fish [Em]monger +but [Am]sure, 'twas no [D7]wonder +For [G]so were her [Em]father and [A7]mother be[D7]fore +They [G]both wheeled their [Em]barrows +through [Am]streets broad and [D7]narrow +Crying [G]“Cockles and Mus[Em]sels, a[A7]live a[D7]live-[G]o” +{end_of_verse} + +{column_break} +{start_of_verse} +She died of the fever, +and nothing could save her +And that was the end of sweet Molly Malone +But her ghost wheels a barrow +through streets broad and narrow +Crying “Cockles and Mussels, alive alive-o” +{end_of_verse} + From 3b1f0026c36e5edc5319005ee1cb703dc35af0ff Mon Sep 17 00:00:00 2001 From: Johan Vromans Date: Mon, 8 Jan 2024 21:16:34 +0100 Subject: [PATCH 12/16] Fix problem finding notes:german et al. --- Changes | 1 + docs/content/ChordPro-Configuration-Overview.md | 4 ++-- lib/ChordPro/Paths.pm | 1 + lib/ChordPro/Version.pm | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Changes b/Changes index a8b70d76..715f741c 100644 --- a/Changes +++ b/Changes @@ -16,6 +16,7 @@ - (Stringdiagram) Fix fret number colours. - Fix handling of XDG_CONFIG_HOME. - Fix 'spread' images. + - Fix problem finding notes:german et al. - (MMA) Fix test fail with perl >= 5.39.6. 6.040 2023-12-26 diff --git a/docs/content/ChordPro-Configuration-Overview.md b/docs/content/ChordPro-Configuration-Overview.md index 81b1e9d2..49ba3935 100644 --- a/docs/content/ChordPro-Configuration-Overview.md +++ b/docs/content/ChordPro-Configuration-Overview.md @@ -108,9 +108,9 @@ Instrument definitions, in particular the settings `"tuning"`, `"notes"` and `"c For example, assume `"chords_italian.json"` defines a number of chords using italian (latin) note names and `"chords_german.json"` defines some chords using german note names. Then the following sequence of configuration files will work as expected: - notes::latin (built-in, enable latin note names) + notes:latin (built-in, enable latin note names) chords_italian.json (defines chords with latin note names) - notes::german (built-in, enable german note names) + notes:german (built-in, enable german note names) chords_german.json (defines chords with german note names) ### Merging hash valued items diff --git a/lib/ChordPro/Paths.pm b/lib/ChordPro/Paths.pm index 4d0c5f0e..5b31723f 100644 --- a/lib/ChordPro/Paths.pm +++ b/lib/ChordPro/Paths.pm @@ -232,6 +232,7 @@ method findcfg ( $p ) { @p = ( $p ); } else { + $p =~ s/:+/\//g; @p = ( "$p.prp", "$p.json" ); } unless ( $found ) { diff --git a/lib/ChordPro/Version.pm b/lib/ChordPro/Version.pm index eeba46de..0f4af7ed 100644 --- a/lib/ChordPro/Version.pm +++ b/lib/ChordPro/Version.pm @@ -1,4 +1,4 @@ # This file is generated. Do not edit! package ChordPro::Version; -our $VERSION = "6.040_007"; +our $VERSION = "6.040_008"; print "$VERSION\n" unless caller; From 80ac0ffb2afdb1aa0516980d28d3d58c52292de4 Mon Sep 17 00:00:00 2001 From: Johan Vromans Date: Mon, 8 Jan 2024 21:25:08 +0100 Subject: [PATCH 13/16] Add some design documents. --- Design/ChordDiagram.odg | Bin 0 -> 23253 bytes Design/ChordPro_Component_Support.odg | Bin 0 -> 25131 bytes Design/StructuredChordPro.org | 23 +++++++++++++++++++++++ Design/capo.txt | 23 +++++++++++++++++++++++ Design/design.xcf | Bin 0 -> 92903 bytes Design/pagelayout.odg | Bin 0 -> 21932 bytes lib/ChordPro/Version.pm | 2 +- 7 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 Design/ChordDiagram.odg create mode 100644 Design/ChordPro_Component_Support.odg create mode 100644 Design/StructuredChordPro.org create mode 100644 Design/capo.txt create mode 100644 Design/design.xcf create mode 100644 Design/pagelayout.odg diff --git a/Design/ChordDiagram.odg b/Design/ChordDiagram.odg new file mode 100644 index 0000000000000000000000000000000000000000..7984f4494af31f4214645ab5a49f4ce3c25a042d GIT binary patch literal 23253 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 literal 0 HcmV?d00001 diff --git a/Design/ChordPro_Component_Support.odg b/Design/ChordPro_Component_Support.odg new file mode 100644 index 0000000000000000000000000000000000000000..adadfeeda98f7b355c4f62a065065f7778e3dfe6 GIT binary patch literal 25131 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 PMt```F8Y)4&!hhW<6k%0 literal 0 HcmV?d00001 diff --git a/Design/StructuredChordPro.org b/Design/StructuredChordPro.org new file mode 100644 index 00000000..c13e861d --- /dev/null +++ b/Design/StructuredChordPro.org @@ -0,0 +1,23 @@ +songbook ::= song+ + +song ::= directive-or-part+ + +directive-or-part ::= directive | part + +directive ::= '{' keyword [ ':' value ] '}' + +part ::= verse | chorus | tab + +verse ::= one or more consequetive songlines + +chorus ::= start-of-chorus verse+ end-of-chorus + +start-of-chorus ::= '{' 'start-of-chorus' | 'soc' '}' + +end-of-chorus ::= '{' 'end-of-chorus' | 'eoc' '}' + +tab ::= start-of-tab lines+ end-of-tab + +start-of-tab ::= '{' 'start-of-tab' | 'sot' '}' + +end-of-tab ::= '{' 'end-of-tab' | 'eot' '}' diff --git a/Design/capo.txt b/Design/capo.txt new file mode 100644 index 00000000..f9a2a93d --- /dev/null +++ b/Design/capo.txt @@ -0,0 +1,23 @@ + Key Capo Chord Display +Mod Down D - D D +Mod Up D - D D +Ignore D - D D + +Key = Concert key + + Key Capo Chord Display +Mod Down D 2 D C +Mod Up D 2 D E +Ignore D 2 D D + +Key = Relative + + Key Capo Chord Display +Mod Down C 2 D C +Mod Up E 2 D E +Ignore D 2 D D + +Note: MuseScore would display D(C) (sounding D, play C). + +While other will prefer D(E). + diff --git a/Design/design.xcf b/Design/design.xcf new file mode 100644 index 0000000000000000000000000000000000000000..bc4f35c3f5e765afc322e892379a7103962844ea GIT binary patch literal 92903 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

go;&2D*dkL}xS58%$$4{1Jjg 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 O*AH&jY@YsP2recw%Pa_+ggPtr-Js(#g7 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 Date: Mon, 8 Jan 2024 21:45:16 +0100 Subject: [PATCH 14/16] (Experimental) Preprocessing per environment. --- lib/ChordPro/Config.pm | 1 + lib/ChordPro/Song.pm | 20 +++++++++++--------- lib/ChordPro/Version.pm | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/lib/ChordPro/Config.pm b/lib/ChordPro/Config.pm index 73288ae1..5d17448d 100644 --- a/lib/ChordPro/Config.pm +++ b/lib/ChordPro/Config.pm @@ -733,6 +733,7 @@ sub hmerge( $left, $right, $path = "" ) { || $path =~ /^pdf\.(?:info|fonts)\./ || $path =~ /^meta\./ || $path =~ /^delegates\./ + || $path =~ /^parser\.preprocess\./ || $path =~ /^debug\./ || $key =~ /^_/; diff --git a/lib/ChordPro/Song.pm b/lib/ChordPro/Song.pm index 5669ce2a..4bf3aa27 100644 --- a/lib/ChordPro/Song.pm +++ b/lib/ChordPro/Song.pm @@ -335,15 +335,17 @@ sub parse_song { warn(sprintf("==[%3d]=> %s\n", $diag->{line}, $diag->{orig} ) ); } - if ( $prep->{all} ) { - # warn("PRE: ", $_, "\n"); - $prep->{all}->($_); - # warn("POST: ", $_, "\n"); - if ( /\n/ ) { - my @a = split( /\n/, $_ ); - $_ = shift(@a); - unshift( @$lines, @a ); - $skipcnt += @a; + for my $pp ( "all", "env-$in_context" ) { + if ( $prep->{$pp} ) { + # warn("PRE: ", $_, "\n"); + $prep->{$pp}->($_); + # warn("POST: ", $_, "\n"); + if ( /\n/ ) { + my @a = split( /\n/, $_ ); + $_ = shift(@a); + unshift( @$lines, @a ); + $skipcnt += @a; + } } } diff --git a/lib/ChordPro/Version.pm b/lib/ChordPro/Version.pm index 9079793d..0f440f3a 100644 --- a/lib/ChordPro/Version.pm +++ b/lib/ChordPro/Version.pm @@ -1,4 +1,4 @@ # This file is generated. Do not edit! package ChordPro::Version; -our $VERSION = "6.040_009"; +our $VERSION = "6.040_010"; print "$VERSION\n" unless caller; From d209c73a077dcbbe2fb2ad047a9cff623236fe71 Mon Sep 17 00:00:00 2001 From: Johan Vromans Date: Tue, 9 Jan 2024 11:51:46 +0100 Subject: [PATCH 15/16] (StringDiagram) Improve bar number. --- lib/ChordPro/Output/PDF/StringDiagram.pm | 14 ++++++++------ lib/ChordPro/Version.pm | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/ChordPro/Output/PDF/StringDiagram.pm b/lib/ChordPro/Output/PDF/StringDiagram.pm index 5947a08e..b95dc1de 100644 --- a/lib/ChordPro/Output/PDF/StringDiagram.pm +++ b/lib/ChordPro/Output/PDF/StringDiagram.pm @@ -139,10 +139,12 @@ method diagram_xo( $info ) { if ( $basefretno > 1 ) { $basefont = $ps->{fonts}->{diagram_base}->{fd}->{font}; - $basesize = $gh; - $bb[0] -= $basefont->width("$basefretno ") * $basesize; + $basesize = $gh/0.85; + $basefretno = sprintf( "%2d", $basefretno ); + $bb[0] -= $basefont->width("xx$basefretno") * $basesize; } else { + $basefretno = ""; $bb[0] -= $dot/2; } if ( $fsh eq "below" && $info->{fingers} ) { @@ -180,12 +182,12 @@ method diagram_xo( $info ) { } # Draw first fret number, if > 1. - if ( $basefretno > 1 ) { - my $i = sprintf("%2d ", $basefretno ); + if ( $basefretno ) { $xo->textstart; $xo->font( $basefont, $basesize ); - $xo->translate( 0, -$nw - ($baselabeloffset+0.85)*$gh ); - $xo->text( "$basefretno ", align => "right" ); + $xo->translate( -$basefont->width("x") * 0.85 * $basesize, + -$nw - ($baselabeloffset+0.85)*$gh ); + $xo->text( $basefretno, align => "right" ); $xo->textend; } diff --git a/lib/ChordPro/Version.pm b/lib/ChordPro/Version.pm index 0f440f3a..edc825b5 100644 --- a/lib/ChordPro/Version.pm +++ b/lib/ChordPro/Version.pm @@ -1,4 +1,4 @@ # This file is generated. Do not edit! package ChordPro::Version; -our $VERSION = "6.040_010"; +our $VERSION = "6.040_011"; print "$VERSION\n" unless caller; From 504f56286360a1b36221e48bea16606246c3346b Mon Sep 17 00:00:00 2001 From: Johan Vromans Date: Tue, 9 Jan 2024 16:38:42 +0100 Subject: [PATCH 16/16] Release 6.042. --- Changes | 6 ++- Makefile.PL | 2 +- docs/content/ChordPro-Reference-RelNotes.md | 41 +++++++++++++++++---- lib/ChordPro/Version.pm | 2 +- 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/Changes b/Changes index 715f741c..cfb9abda 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,8 @@ -0.000 +6.042 2024-01-09 - - !Highlights + - !This is a bugfix release. + + - !Important - To trace problems, the ChordPro 'about' information is included in the PDF. This should not reveal sensitive information, but in diff --git a/Makefile.PL b/Makefile.PL index e7667049..5778edcd 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -43,7 +43,7 @@ WriteMakefile 'Text::Layout' => 0.032, 'JSON::PP' => 2.27203, 'String::Interpolate::Named' => 1.030, - 'File::LoadLines' => 1.042, + 'File::LoadLines' => 1.044, 'File::HomeDir' => 1.004, 'Image::Info' => 1.41, 'List::Util' => 1.46, diff --git a/docs/content/ChordPro-Reference-RelNotes.md b/docs/content/ChordPro-Reference-RelNotes.md index 844f1f3f..64f354b5 100644 --- a/docs/content/ChordPro-Reference-RelNotes.md +++ b/docs/content/ChordPro-Reference-RelNotes.md @@ -1,5 +1,37 @@ # Release info +## 6.042 + +Released: 2024-01-09 + + +### This is a bugfix release. + + +### Important + +* To trace problems, the ChordPro 'about' information is included in the PDF. This should not reveal sensitive information, but in case this bothers you, you can disable this by setting debug.runtimeinfo to 0 in the config. + +### Functionality + +* Report XDG_CONFIG_HOME in runtime info. +* Include 'about' info as PDF metadata. + +### Bug fixes + +* Post-release typo fixes. +* (Stringdiagram) Fix font size of base fret numeral (issue 337). +* (Stringdiagram) Fix fret number colours. +* Fix handling of XDG_CONFIG_HOME. +* Fix 'spread' images. +* Fix problem finding notes:german et al. +* (MMA) Fix test fail with perl >= 5.39.6. + +### Social and support + +[User community](https://groups.io/g/ChordPro) for feedback and help. +Please use the [issue tracker](https://github.com/ChordPro/chordpro/issues) for bugs reports. + ## 6.040 Released: 2023-12-26 @@ -8,8 +40,8 @@ Released: 2023-12-26 ### Highlights * Images can be [placed everywhere](https://chordpro.org/chordpro/directives-image/). They can be placed relative to the paper, the page, the column, and the lyrics. -* Images can be [embedded[(https://chordpro.org/chordpro/directives-image/#inline-images) in text (lyrics) lines, either as part of the text similar to a glyph, or somewhere else on the page relative to a particular place in the text. The latter is most interesting for annotations. -* Delegates are images too. Annotate your lyrics with SVG images, or with musical notes using ABC or Lilypond. +* Images can be [embedded](https://chordpro.org/chordpro/directives-image/#inline-images) in text (lyrics) lines, either as part of the text similar to a glyph, or somewhere else on the page relative to a particular place in the text. The latter is most interesting for annotations. +* Delegates are images too. Annotate your lyrics with SVG images and musical notes using ABC or Lilypond. * Chord and keyboard diagrams are images too. And you can use string and keyboard diagrams simultaneously. * Resources like configs, tasks and images are now more logically searched using [resource libraries](https://chordpro.org/chordpro/resources/). @@ -52,11 +84,6 @@ Released: 2023-12-26 * (PDF) Enhance assets (wip), labels; move grid to separate module. * Experimental ##include facility. -### Social and support - -[User community](https://groups.io/g/ChordPro) for feedback and help. -Please use the [issue tracker](https://github.com/ChordPro/chordpro/issues) for bugs reports. - ## 6.030 Released: 2023-09-18 diff --git a/lib/ChordPro/Version.pm b/lib/ChordPro/Version.pm index edc825b5..54906e37 100644 --- a/lib/ChordPro/Version.pm +++ b/lib/ChordPro/Version.pm @@ -1,4 +1,4 @@ # This file is generated. Do not edit! package ChordPro::Version; -our $VERSION = "6.040_011"; +our $VERSION = "6.042"; print "$VERSION\n" unless caller;