lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Question about paths in point-and-click


From: Paolo Prete
Subject: Re: Question about paths in point-and-click
Date: Mon, 31 Oct 2022 18:20:15 +0100


Thank you as always! 

In Spontini-Editor there are examples with generated SVG files that rely on point-and-click in order to be edited. Although included paths are dummy paths, I would like to clean them without post-processing the files. But I think I don't have alternatives, given that the functions you use are not part of the API (and I need to make this operation any supported LilyPond version). I preview I have to do some Python postprocess script with regex

 
Cheers, 
Paolo 


On Monday, October 31, 2022, Jean Abou Samra <jean@abou-samra.fr> wrote:
Le 31/10/2022 à 17:56, Jean Abou Samra a écrit :
In general, no.


Well, I spoke too fast. You can do

\version "2.23.80"

#(set!
  (@@ (lily output-ps) stencil-dispatch-alist)
  (assq-set!
   (@@ (lily output-ps) stencil-dispatch-alist)
   'grob-cause
   (lambda (offset grob)
     (if (ly:get-option 'point-and-click)
         (let* ((cause (ly:grob-property grob 'cause))
                (music-origin (if (ly:stream-event? cause)
                                  (ly:event-property cause 'origin)))
                (point-and-click (ly:get-option 'point-and-click)))
           (if (and
                (ly:input-location? music-origin)
                (cond ((boolean? point-and-click) point-and-click)
                      ((symbol? point-and-click)
                       (ly:in-event-class? cause point-and-click))
                      (else (any (lambda (t)
                                   (ly:in-event-class? cause t))
                                 point-and-click))))
               (let* ((location (ly:input-file-line-char-column music-origin))
                      (raw-file (car location))
                      (file (if (is-absolute? raw-file)
                                raw-file
                                (string-append (ly-getcwd) "/" raw-file)))
                      (x-ext (ly:grob-extent grob grob X))
                      (y-ext (ly:grob-extent grob grob Y)))

                 (if (and (< 0 (interval-length x-ext))
                          (< 0 (interval-length y-ext)))
                     (ly:format " ~4f ~4f ~4f ~4f (textedit://~a:~a:~a:~a) mark_URI\n"
                                (+ (car offset) (car x-ext))
                                (+ (cdr offset) (car y-ext))
                                (+ (car offset) (cdr x-ext))
                                (+ (cdr offset) (cdr y-ext))

                                ;; Backslashes are not valid
                                ;; file URI path separators.
;;;;;;;;;;;;;;;;(ly:string-percent-encode
                                ;;;;;;;;;;;;;;;; (ly:string-substitute "\\" "/" file))
                                "foo.ly"

                                (cadr location)
                                (caddr location)
                                (1+ (cadddr location)))
                     ""))
               ""))
         ""))))

{ c' }




Basically, tamper with the LilyPond function that outputs
these textedit:// links. In this example, I'm replacing
the file name with "foo.ly".

However, this is using undocumented variables that are explicitly
not public, so you're at your own risk -- it can and almost
certainly will break with some future version of LilyPond,
and a replacement will not be guaranteed to exist. Also, it
would need different code to work in SVG output.

If you can use a different method, that would be really preferable.

Best,
Jean




reply via email to

[Prev in Thread] Current Thread [Next in Thread]