summaryrefslogtreecommitdiffstats
path: root/external/lilypond-builtins-generator.ly
diff options
context:
space:
mode:
Diffstat (limited to 'external/lilypond-builtins-generator.ly')
-rw-r--r--external/lilypond-builtins-generator.ly391
1 files changed, 391 insertions, 0 deletions
diff --git a/external/lilypond-builtins-generator.ly b/external/lilypond-builtins-generator.ly
new file mode 100644
index 0000000..983b4c3
--- /dev/null
+++ b/external/lilypond-builtins-generator.ly
@@ -0,0 +1,391 @@
+%% Autogenerate a list of LilyPond keywords
+
+\version "2.23.6"
+
+#(use-modules (ice-9 receive)
+ (ice-9 regex))
+
+#(define port (open-output-file "../pygments/lexers/_lilypond_builtins.py"))
+
+#(define output-preamble
+ "\"\"\"
+ pygments.lexers._lilypond_builtins
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ LilyPond builtins.
+
+ :copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+\"\"\"
+
+# Contents generated by the script lilypond-builtins-generator.ly
+# found in the external/ directory of the source tree.
+
+")
+
+#(format port "~a" output-preamble)
+
+#(define (dump-py-list name vals)
+ (let* ((string-vals
+ (map symbol->string vals))
+ (fixed-vals
+ (filter-map
+ (lambda (str)
+ ; To avoid conflicts with Scheme builtins,
+ ; a leading backslash is prepended to \<,
+ ; \= and a few others. The lexer finds it
+ ; itself, so remove it here.
+ (cond
+ ((equal? str "\\\\")
+ #f)
+ ((string-startswith str "\\")
+ (string-drop str 1))
+ (else
+ str)))
+ string-vals))
+ (sorted-vals ; reproducibility
+ ; Avoid duplicates (e.g., identical pitches
+ ; in different languages)
+ (uniq-list
+ (sort fixed-vals string<?)))
+ (formatted-vals
+ (map
+ (lambda (val)
+ (format #f " \"~a\"," val name))
+ sorted-vals))
+ (joint-vals
+ (string-join formatted-vals "\n")))
+ (format port
+ "~a = [
+~a
+]
+
+"
+ name
+ joint-vals)))
+
+
+%% KEYWORDS
+
+#(define keywords
+ '(
+ ; Lexical modes.
+ notemode
+ lyricmode
+ lyricsto
+ addlyrics
+ chordmode
+ chords
+ figuremode
+ figures
+ drummode
+ drums
+ ; Output definitions.
+ header
+ layout
+ midi
+ paper
+ ; Context definitions.
+ ;; \context is also used in music. We take it as
+ ;; a keyword in both cases.
+ context
+ with
+ name
+ type
+ accepts
+ denies
+ alias
+ defaultchild
+ consists
+ remove
+ description
+ ;; Not strictly a keyword, but can be viewed so.
+ inherit-acceptability
+ ; Blocks.
+ book
+ bookpart
+ score
+ ; Other.
+ new
+ etc
+ include
+ language
+ version))
+
+#(dump-py-list 'keywords keywords)
+
+%% CLEFS
+
+#(define all-clefs
+ (map string->symbol (map car supported-clefs)))
+
+#(dump-py-list 'clefs all-clefs)
+
+%% SCALES
+
+#(define all-scales
+ '(major
+ minor
+ ionian
+ locrian
+ aeolian
+ mixolydian
+ lydian
+ phrygian
+ dorian))
+
+#(dump-py-list 'scales all-scales)
+
+%% REPEAT TYPES
+
+#(define all-repeat-types
+ '(volta percent unfold segno))
+
+#(dump-py-list 'repeat_types all-repeat-types)
+
+%% UNITS
+
+#(define all-units
+ '(mm cm in pt staff-space))
+
+#(dump-py-list 'units all-units)
+
+%% CHORD MODIFIERS
+
+#(define all-chord-modifiers
+ '(m dim aug maj))
+
+#(dump-py-list 'chord_modifiers all-chord-modifiers)
+
+%% PITCHES
+
+#(define all-pitch-language-names
+ (map car language-pitch-names))
+
+#(dump-py-list 'pitch_language_names all-pitch-language-names)
+
+#(define all-pitch-names
+ (append
+ ; We highlight rests just like pitches.
+ '(r R)
+ (map car (append-map cdr language-pitch-names))
+ ; Drum note names.
+ (map car drumPitchNames)))
+
+#(dump-py-list 'pitches all-pitch-names)
+
+%% MUSIC FUNCTIONS AND SHORTCUTS
+
+% View these as music functions.
+#(define extra-music-functions
+ '(set
+ unset
+ override
+ revert
+ tweak
+ once
+ undo
+ temporary
+ repeat
+ alternative
+ tempo
+ change))
+
+#(let* ((module (current-module))
+ (module-alist (ly:module->alist module))
+ (all-music-functions
+ (filter
+ (lambda (entry)
+ (ly:music-function? (cdr entry)))
+ module-alist))
+ (all-predefined-music-objects
+ (filter
+ (lambda (entry)
+ (ly:music? (cdr entry)))
+ module-alist)))
+ (receive (articulations non-articulations)
+ (partition
+ (lambda (entry)
+ (ly:event? (cdr entry)))
+ all-predefined-music-objects)
+ (receive (dynamics non-dynamic-articulations)
+ (partition
+ (lambda (entry)
+ (any
+ (lambda (type)
+ (music-is-of-type? (cdr entry)
+ type))
+ '(dynamic-event crescendo-event decrescendo-event)))
+ articulations)
+ (dump-py-list 'music_functions
+ (append extra-music-functions
+ (map car all-music-functions)))
+ (dump-py-list 'dynamics (map car dynamics))
+ (dump-py-list 'articulations (map car non-dynamic-articulations))
+ (dump-py-list 'music_commands (map car non-articulations)))))
+
+%% MARKUP COMMANDS
+
+#(let* ((markup-name-regexp
+ (make-regexp "(.*)-markup(-list)?"))
+ (modules
+ (cons (current-module)
+ (map resolve-module '((lily) (lily accreg)))))
+ (alist
+ (apply append
+ (map ly:module->alist modules)))
+ (markup-commands
+ (filter
+ (lambda (entry)
+ (or (markup-function? (cdr entry))
+ (markup-list-function? (cdr entry))))
+ alist))
+ (markup-command-names
+ (map
+ (lambda (entry)
+ (let* ((string-name (symbol->string (car entry)))
+ (match (regexp-exec markup-name-regexp string-name)))
+ (string->symbol (match:substring match 1))))
+ markup-commands))
+ (markup-words
+ (append '(markup markuplist)
+ markup-command-names)))
+ (dump-py-list 'markup_commands markup-words))
+
+%% GROBS
+
+#(let ((grob-names (map car all-grob-descriptions)))
+ (dump-py-list 'grobs grob-names))
+
+%% CONTEXTS
+
+#(let* ((layout-module
+ (ly:output-def-scope $defaultlayout))
+ (layout-alist
+ (ly:module->alist layout-module))
+ (all-context-defs
+ (filter
+ (lambda (entry)
+ (ly:context-def? (cdr entry)))
+ layout-alist))
+ (context-def-names
+ (map car all-context-defs)))
+ (dump-py-list 'contexts context-def-names))
+
+%% TRANSLATORS
+
+#(let* ((all-translators
+ (ly:get-all-translators))
+ (translator-names
+ (map ly:translator-name all-translators)))
+ (dump-py-list 'translators translator-names))
+
+%% SCHEME FUNCTIONS
+
+#(let* ((module (resolve-module '(lily)))
+ (module-alist (ly:module->alist module))
+ (all-functions
+ (filter
+ (lambda (entry)
+ (or (procedure? (cdr entry))
+ (macro? (cdr entry))))
+ module-alist))
+ (all-function-names
+ (map car all-functions)))
+ (dump-py-list 'scheme_functions all-function-names))
+
+%% PROPERTIES
+
+#(dump-py-list 'context_properties all-translation-properties)
+#(dump-py-list 'grob_properties all-backend-properties)
+
+%% PAPER VARIABLES
+
+% Reference: https://lilypond.org/doc/v2.22/Documentation/notation/page-layout
+#(define all-paper-variables
+ '(paper-height
+ top-margin
+ bottom-margin
+ ragged-bottom
+ ragged-last-bottom
+ markup-system-spacing
+ score-markup-spacing
+ score-system-spacing
+ system-system-spacing
+ markup-markup-spacing
+ last-bottom-spacing
+ top-system-spacing
+ top-markup-spacing
+ paper-width
+ line-width
+ left-margin
+ right-margin
+ check-consistency
+ ragged-right
+ ragged-last
+ two-sided
+ inner-margin
+ outer-margin
+ binding-offset
+ horizontal-shift
+ indent
+ short-indent
+ max-systems-per-page
+ min-systems-per-page
+ systems-per-page
+ system-count
+ page-breaking
+ page-breaking-system-system-spacing
+ page-count
+ blank-page-penalty
+ blank-last-page-penalty
+ auto-first-page-number
+ first-page-number
+ print-first-page-number
+ page-number-type
+ page-spacing-weight
+ print-all-headers
+ system-separator-markup
+ footnote-separator-markup
+ ;; Let's view these four as \paper variables.
+ basic-distance
+ minimum-distance
+ padding
+ stretchability
+ ;; These were forgotten in the documentation.
+ evenHeaderMarkup
+ oddHeaderMarkup
+ evenFooterMarkup
+ oddFooterMarkup
+ bookTitleMarkup
+ scoreTitleMarkup
+ ))
+
+#(dump-py-list 'paper_variables all-paper-variables)
+
+%% HEADER VARIABLES
+
+% Reference: https://lilypond.org/doc/v2.22/Documentation/notation/creating-titles-headers-and-footers.html#default-layout-of-bookpart-and-score-titles
+#(define all-header-variables
+ '(dedication
+ title
+ subtitle
+ subsubtitle
+ instrument
+ poet
+ composer
+ meter
+ arranger
+ tagline
+ copyright
+ piece
+ opus
+ ; The following are used in LSR snippets and regression tests.
+ lsrtags
+ doctitle
+ texidoc))
+
+#(dump-py-list 'header_variables all-header-variables)
+
+
+#(close-port port)