Improve elbowed-hairpin (issue 324800043 by thomasmorle...@gmail.com)
Reviewers: , Message: Please review. Description: Improve elbowed-hairpin Let the lines be printed by the new make-connected-line-procedure, using ly:line-interface::line. The new stencil now reacts on overrides for style and dash-period/fraction. Not closing Hairpins created by elbowed-hairpin are possible now. Single disadvantage: The point-list needs to have (0 . 0) first, if a closing Hairpin is wished. The previous used make-connected-path did that automatically and thus was not flexible enough. Give the final stencil proper extents. Cleanup, more descriptive naming, extent docstring. Please review this at https://codereview.appspot.com/324800043/ Affected files (+56, -32 lines): M scm/output-lib.scm Index: scm/output-lib.scm diff --git a/scm/output-lib.scm b/scm/output-lib.scm index 56e348da3dbcb0c2bf6951d9e8913f357e38e6e9..76d17cb7c07251986b2b99150219c0bbc91b6203 100644 --- a/scm/output-lib.scm +++ b/scm/output-lib.scm @@ -1165,21 +1165,43 @@ between the two text elements." '(bound-details left padding) (+ my-padding script-padding))) +(define-public (make-connected-line pts grob) + "Returns a line connecting @var{pts}, gets layout information from @var{grob}" + (define (connected-points grob ls pts) +(if (not (pair? (cdr pts))) +(apply ly:stencil-add empty-stencil ls) +(connected-points + grob + (cons +(ly:line-interface::line + grob + (car (first pts)) + (cdr (first pts)) + (car (second pts)) + (cdr (second pts))) +ls) + (cdr pts + (connected-points grob '() pts)) + (define ((elbowed-hairpin coords mirrored?) grob) "Create hairpin based on a list of @var{coords} in @code{(cons x y)} form. @code{x} is the portion of the width consumed for a given line and @code{y} is the portion of the height. For example, -@code{'((0.3 . 0.7) (0.8 . 0.9) (1.0 . 1.0))} means that at the point +@code{'((0 . 0) (0.3 . 0.7) (0.8 . 0.9) (1.0 . 1.0))} means that at the point where the hairpin has consumed 30% of its width, it must be at 70% of its height. Once it is to 80% width, it -must be at 90% height. It finishes at -100% width and 100% height. @var{mirrored?} indicates if the hairpin -is mirrored over the Y-axis or if just the upper part is drawn. +must be at 90% height. It finishes at 100% width and 100% height. +If @var{coords} does not begin with @code{'(0 . 0)} the final hairpin may have +an open tip. For example '(0 . 0.5) will cause an open end of 50% of the usual +height. +@var{mirrored?} indicates if the hairpin is mirrored over the Y-axis or if +just the upper part is drawn. Returns a function that accepts a hairpin grob as an argument and draws the stencil based on its coordinates. + @lilypond[verbatim,quote] #(define simple-hairpin - (elbowed-hairpin '((1.0 . 1.0)) #t)) + (elbowed-hairpin '((0 . 0)(1.0 . 1.0)) #t)) \\relative c' { \\override Hairpin #'stencil = #simple-hairpin @@ -1187,50 +1209,52 @@ and draws the stencil based on its coordinates. } @end lilypond " - (define (pair-to-list pair) -(list (car pair) (cdr pair))) - (define (normalize-coords goods x y) + (define (scale-coords coords-list x y) (map - (lambda (coord) - (cons (* x (car coord)) (* y (cdr coord - goods)) - (define (my-c-p-s points thick decresc?) -(make-connected-path-stencil - points - thick - (if decresc? -1.0 1.0) - 1.0 - #f - #f)) + (lambda (coord) (cons (* x (car coord)) (* y (cdr coord + coords-list)) + + (define (hairpin::print-part points decresc? me) +(let ((stil (make-connected-line points me))) + (if decresc? (ly:stencil-scale stil -1 1) stil))) + ;; outer let to trigger suicide (let ((sten (ly:hairpin::print grob))) (if (grob::is-live? grob) (let* ((decresc? (eqv? (ly:grob-property grob 'grow-direction) LEFT)) - (thick (ly:grob-property grob 'thickness 0.1)) - (thick (* thick (layout-line-thickness grob))) (xex (ly:stencil-extent sten X)) (lenx (interval-length xex)) (yex (ly:stencil-extent sten Y)) (leny (interval-length yex)) (xtrans (+ (car xex) (if decresc? lenx 0))) (ytrans (car yex)) - (uplist (map pair-to-list -(normalize-coords coords lenx (/ leny 2 - (downlist (map pair-to-list - (normalize-coords coords lenx (/ leny -2) - (ly:stencil-translate - (ly:stencil-add -(my-c-p-s uplist thick decresc?) -(if mirrored? (my-c-p-s downlist thick decresc?) empty-stencil)) - (cons xtrans ytrans))) + (uplist (scale-coords coords lenx (/ leny 2)
Re: help with bash script to translate @ref{} items in translated manuals
Federico Bruni: > Il giorno ven 21 apr 2017 alle 7:08, Federico Bruni > ha scritto: > > I guess I'll have to revert to my almost manual replacement I've used > > so far. > > Or I may try a different approach and script a replacement from a file > like: > > @ref{Different editions from one source},@ref{Edizioni diverse da un > unico sorgente} > @ref{Dimensions},@ref{Dimensioni} > @ref{Direction and placement},@ref{Direzione e posizionamento} > > that replace first instance of @ref with the second instance (after the > comma) Well, that is about the same as putting the translation in the po file and running the attached script. Then if and when gettext is working again for doc., as someone said it has been, then you don't have to convert your replacement file to po style. $ read_po.pl Documentation/po/it.po .itely | head File: Documentation/essay/engraving.itely @ref{Music engraving} -> @ref{} @ref{The LilyPond story} -> @ref{} @ref{Engraving details} -> @ref{} @ref{Music fonts} -> @ref{} @ref{Optical spacing} -> @ref{} @ref{Ledger lines} -> @ref{} @ref{Optical sizing} -> @ref{} @ref{Why work so hard?} -> @ref{} @ref{Automated engraving} -> @ref{} $ Regards, /Karl Hammar --- Aspö Data Lilla Aspö 148 S-742 94 Östhammar Sweden +46 173 140 57 #!/usr/bin/perl -w use strict; use Data::Dumper; my %file_list; sub read_po() { my $po_file = $ARGV[0]; my @arr; open(FH, $po_file) || die("cannot open $po_file"); my $nxt = [ [], "", "" ]; while () { chomp; s/^\s*//; s/\s*$//; if (m/^$/) { my %file; my @lst; for my $r (@{$$nxt[0]}) { next if ($r =~ m|Documentation/cs/|); if ($r =~ m| in (Documentation/.*\.itely)$|) { $file{$1} = 1; } push @lst, $r; } my @Keys = sort keys %file; if (@Keys) { $$nxt[0] = [ @lst ]; push @arr, $nxt; for my $f (@Keys) { if (!defined($file_list{$f})) { $file_list{$f} = []; } my $r = [ $$nxt[1], $$nxt[2] ]; push @{$file_list{$f}}, $r; } } $nxt = [ [], "", "" ]; next; } if (m/^\#/) { push @{$$nxt[0]}, $_; next; } if (m/^msgid\s*\"(.*)\"$/) { my $str = $1; $$nxt[1] = $str; next; } if (m/^msgstr\s*\"(.*)\"$/) { my $str = $1; $$nxt[2] = $str; next; } if (m/^\"(.*)\"$/) { my $str = $1; if ($$nxt[2] eq "") { $$nxt[1] .= $str; } else { $$nxt[2] .= $str; } next; } warn("unhandled data: <$_>"); } close(FH); @arr; } sub print_arr(@) { my @arr = @_; for my $r (@arr) { print join("\n", @{$$r[0]}), "\n"; print "msgid \"$$r[1]\"\n"; print "msgstr \"$$r[2]\"\n"; print "\n"; } } sub mk_subst(@) { my @arr = @_; #print Dumper(\%file_list); my @k = sort keys %file_list; for my $k (@k) { my @val = @{$file_list{$k}}; print "File: $k\n"; for my $r (@val) { print " \@ref{$$r[0]} -> \@ref{$$r[1]}\n"; } print "\n"; } } sub main() { my @arr = read_po(); #print_arr(@arr); mk_subst(); } main();___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: LilyPond Slack channel
The #lilypond channel IRC is a public space. I've used it for communicating with a GSoC student in the past. Here is a nice little article on the subject: https://drewdevault.com/2015/11/01/Please-stop-using-slack.html. It's a little old. Given that LilyPond is a Gnu project it certainly makes more sense to me to use IRC --- the whole respecting your freedom thing. Rachael Carlson ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel
Re: LilyPond Slack channel
Jeffery Shivers writes: > Hi everyone, > > I thought it might be useful to create a Slack channel for LilyPond, > particularly with the advent of another Google Summer of Code term. > > Most GSoC orgs encourage some sort of IRC or other chat protocol for > students / mentors / admins to interact, but of course the downside is > that these aren't usually public spaces. The #lilypond channel IRC is a public space. I've used it for communicating with a GSoC student in the past. Anything wrong with that that a proprietary non-standard tool likely to go away in few years at most would fix? -- David Kastrup ___ lilypond-devel mailing list lilypond-devel@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-devel