Hello, Pygments is a Python syntax highlighter supporting many languages, used by Sphinx-documented projects, users of the 'minted' LaTeX package, Wikipedia, and various websites. I'd like to see Pygments supporting LilyPond. Here is my pull request (the equivalent of a merge request, on GitHub):
https://github.com/pygments/pygments/pull/1845 (Note that there is a previous attempt, https://github.com/pygments/pygments/pull/1371. However, it is far less precise, does not understand Scheme, and, above all, reuses code covered by the GPL from Frescobaldi, making it unsuitable for inclusion in the BSD-licensed Pygments.) Reviews and testing would be appreciated. In particular, if you would not like to have a later unpleasant surprise with my aesthetic choices, please give the style a look; the eventual goal would be to make this used in our documentation. The setup to start testing is (assuming Python 3 installed): git clone https://github.com/Jean-Abou-Samra/pygments.git cd pygments git checkout lilypond python3 -m venv pygments-env source pygments-env/bin/activate pip install -r requirements.txt Then you can highlight file.ly, outputting to file.html, using python -m pygments -f html -O full,style=lilypond file.ly > file.html (If you begin a new session of testing, don't forget to start with 'source pygments-env/bin/activate'.) To whet your appetite, a highlighted version of the test file included in the PR is attached. Cheers, Jean
\version "2.23.3" % This is a test file for Pygments' LilyPond support. To compile % it with Guile 1 (as in official releases as of this writing), % remove the "commented form" below. %{ All supported constructs are covered in this file. For example, multi-line comments. These are non-nested. The following will end the whole comment: %{ %} \header { title = "This is an assignment to a string." composer = \markup \smallCaps "And this is a markup" } % The following is just a comment. %} \paper { indent = 30\staff-space page-count = 1 } myFunc = # #;(This is a commented form. After it, we are still in Scheme mode.) (define-music-function (music n) (ly:music? index?) (let* ((repeated (make-list n music)) (copied (map ly:music-deep-copy repeated))) ; This is a Scheme comment. (make-sequential-music copied))) mySecondFunc = #(define-music-function (music) (ly:music?) #{ % LilyPond syntax here. \compressMMRests \shiftDurations -2 1 # ; Scheme syntax again. (ly:music-deep-copy music) #}) myPitch = ##{ c #} % Here we should be back to LilyPond mode. This % is a LilyPond comment. << \new Staff \with { \consists Duration_line_engraver } \relative c' { \clef alto \time 6/8 \key d \major \cadenzaOn deses'!4.~(\tweak thickness 4\( deses^\p-\signumcongruentiae_1\4 deses\longa) \myFunc { r } 4 des8 8[ <des ges>8]\) \bar "||" \cadenzaOff \once \hide NoteHead \once \override NoteHead.no-ledgers = ##t \once \omit Dots \once \override Staff.DurationLine.thickness = #5 c''?2.:16\-^"Some music" | \mySecondFunc R1*1/2^\markup \center-column { Some Text In A \bold \italic Column! super % not highlighted as a markup command } \repeat unfold 4 { c8\< c^\> c\p\! } } \addlyrics { \set Score.melismaBusyProperties = #'() My Lily -- Song } \chordmode { c cis:3+ des:maj7/+e } \new TabVoice { f'4\^ g'4\^ f'2 } \drums { hihat4 hh bassdrum bd } >>
\version "2.23.3" % This is a test file for Pygments' LilyPond support. To compile % it with Guile 1 (as in official releases as of this writing), % remove the "commented form" below. %{ All supported constructs are covered in this file. For example, multi-line comments. These are non-nested. The following will end the whole comment: %{ %} \header { title = "This is an assignment to a string." composer = \markup \smallCaps "And this is a markup" } % The following is just a comment. %} \paper { indent = 30\staff-space page-count = 1 } myFunc = # #;(This is a commented form. After it, we are still in Scheme mode.) (define-music-function (music n) (ly:music? index?) (let* ((repeated (make-list n music)) (copied (map ly:music-deep-copy repeated))) ; This is a Scheme comment. (make-sequential-music copied))) mySecondFunc = #(define-music-function (music) (ly:music?) #{ % LilyPond syntax here. \compressMMRests \shiftDurations -2 1 # ; Scheme syntax again. (ly:music-deep-copy music) #}) myPitch = ##{ c #} % Here we should be back to LilyPond mode. This % is a LilyPond comment. << \new Staff \with { \consists Duration_line_engraver } \relative c' { \clef alto \time 6/8 \key d \major \cadenzaOn deses'!4.~(\tweak thickness 4\( deses^\p-\signumcongruentiae_1\4 deses\longa) \myFunc { r } 4 des8 8[ <des ges>8]\) \bar "||" \cadenzaOff \once \hide NoteHead \once \override NoteHead.no-ledgers = ##t \once \omit Dots \once \override Staff.DurationLine.thickness = #5 c''?2.:16\-^"Some music" | \mySecondFunc R1*1/2^\markup \center-column { Some Text In A \bold \italic Column! super % not highlighted as a markup command } \repeat unfold 4 { c8\< c^\> c\p\! } } \addlyrics { \set Score.melismaBusyProperties = #'() My Lily -- Song } \chordmode { c cis:3+ des:maj7/+e } \new TabVoice { f'4\^ g'4\^ f'2 } \drums { hihat4 hh bassdrum bd } >>