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 <j...@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