X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=python%2Fconvertrules.py;h=77d83ff52a5420b944858b86e1ada582b0227d0e;hb=3c121fc276bc3c60beb76e0d853c5f21caa4663a;hp=121b12182cadfad528e7e31903a2cd17b5dfa7a8;hpb=136e98fe24af669dbc88dfd088b5c467d7bdbac6;p=lilypond.git diff --git a/python/convertrules.py b/python/convertrules.py index 121b12182c..77d83ff52a 100644 --- a/python/convertrules.py +++ b/python/convertrules.py @@ -2846,7 +2846,7 @@ def conv(str): if re.search("(Slur|Tie)\w+#\'dash-fraction", str) \ or re.search("(Slur|Tie)\w+#\'dash-period", str): stderr_write (NOT_SMART % "dash-fraction, dash-period") - stderr_write (_ ("Dash parameters for slurs and ties are now in \'dash-details.\n")) + stderr_write (_ ("Dash parameters for slurs and ties are now in \'dash-definition.\n")) stderr_write (UPDATE_MANUALLY) return str @@ -3298,12 +3298,15 @@ def brace_matcher (n): return r"[^{}]*?(?:{"*n+r"[^{}]*?"+r"}[^{}]*?)*?"*n matchstring = r'"(?:[^"\\]|\\.)*"' -matcharg = (r"\s+(?:[$#]['`]?\s*(?:[a-zA-Z]\S*|" + matchstring + r"|\(" - + paren_matcher(20) + r"\))|" + matchstring + r"|\\[a-z_A-Z]+)") -matchmarkup = (r'(?:\\markup\s*(?:{' + brace_matcher (20) +r'}|' + +matcharg = (r"\s+(?:[$#]['`]?\s*(?:[a-zA-Z][^ \t\n()\\]*|" + matchstring + + r"|#?\(" + paren_matcher(20) + r"\)|" + + r"-?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)|" + + r"#(?:[tf]|\\.|@?\{" + brace_matcher (10) + r"#@?\}))|" + + matchstring + r"|\\[a-z_A-Z]+|[0-9]+(?:/[0-9]+)?|-[0-9]+)") +matchmarkup = (r'(?:\\markup\s*(?:@?\{' + brace_matcher (20) +r'\}|' + matchstring + r'|(?:\\[a-z_A-Z][a-z_A-Z-]*(?:' + matcharg + - r')*?\s*)*(?:' + matchstring + "|{" + brace_matcher (20) + - "}))|" + matchstring + ")") + r')*?\s*)*(?:' + matchstring + r"|@?\{" + brace_matcher (20) + + r"\}))|" + matchstring + ")") @rule((2, 15, 25), r"\(auto)?Footnote(Grob)? -> \footnote") def conv (str): @@ -3450,7 +3453,7 @@ def conv (str): if m.group (1): return m.group (0) x = m.group (2) + m.group (4) - + if m.group (3): x = x + re.sub (r"(\s*)(" + symbol_list + ")", fn_path_replace, m.group (3)) @@ -3521,6 +3524,28 @@ def conv(str): r"\1/\2", str) return str +@rule((2, 17, 14), r"\accepts ... -> \accepts ... \defaultchild ...") +def conv(str): + def matchaccepts(m): + # First weed out definitions starting from an existing + # definition: we assume that the inherited \defaultchild is + # good enough for our purposes. Heuristic: starts with a + # backslash and an uppercase letter. + if re.match (r"\s*\\[A-Z]", m.group (1)): + return m.group (0) + # existing defaultchild obviously trumps all + if re.search (r"\\defaultchild[^-_a-zA-Z]", m.group (1)): + return m.group (0) + # take the first \\accepts if any and replicate it + return re.sub ("(\r?\n[ \t]*|[ \t]+)" + + r"""\\accepts(\s+(?:#?".*?"|[-_a-zA-Z]+))""", + r"\g<0>\1\\defaultchild\2", + m.group (0), 1) + + str = re.sub (r"\\context\s*@?\{(" + brace_matcher (20) + ")\}", + matchaccepts, str) + return str + @rule((2, 17, 15), r"""#(ly:set-option 'old-relative) \relative -> \relative c'""") def conv(str): @@ -3591,6 +3616,207 @@ def conv(str): r"\1", str) return str +@rule((2, 17, 25), r'''\tempo 4. = 50~60 -> \tempo 4. = 50-60 +-| -> -! +pipeSymbol, escapedParenthesisOpenSymbol ... -> "|", "\\(" ...''') +def conv(str): +# This goes for \tempo commands ending with a range, like +# = 50 ~ 60 +# and uses - instead. We don't explicitly look for \tempo since the +# complete syntax has a large number of variants, and this is quite +# unlikely to occur in other contexts + str = re.sub (r"(=\s*[0-9]+\s*)~(\s*[0-9]+\s)", r"\1-\2", str) +# Match strings, and articulation shorthands that end in -^_ +# so that we leave alone -| in quoted strings and c4--| + def subnonstring(m): + if m.group (1): + return m.group (1)+"!" + return m.group (0) + str = re.sub (r"([-^_])\||" + matchstring + r"|[-^_][-^_]", subnonstring, str) + str = re.sub (r"\bdashBar\b", "dashBang", str) + orig = [ "pipeSymbol", + "bracketOpenSymbol", + "bracketCloseSymbol", + "tildeSymbol", + "parenthesisOpenSymbol", + "parenthesisCloseSymbol", + "escapedExclamationSymbol", + "escapedParenthesisOpenSymbol", + "escapedParenthesisCloseSymbol", + "escapedBiggerSymbol", + "escapedSmallerSymbol" ] + repl = [ r'"|"', + r'"["', + r'"]"', + r'"~"', + r'"("', + r'")"', + r'"\\!"', + r'"\\("', + r'"\\)"', + r'"\\>"', + r'"\\<"'] + words = r"\b(?:(" + ")|(".join (orig) + r"))\b" + def wordreplace(m): + def instring(m): + return re.sub (r'["\\]',r'\\\g<0>',repl[m.lastindex-1]) + if m.lastindex: + return repl[m.lastindex-1] + return '"' + re.sub (words, instring, m.group(0)[1:-1]) + '"' + str = re.sub (words + "|" + matchstring, wordreplace, str) + return str + +@rule((2, 17, 27), r'''\stringTuning \notemode -> \stringTuning''') +def conv(str): + str = re.sub (r"\\stringTuning\s*\\notemode(\s*)@?\{\s*(.*?)\s*@?\}", + r"\\stringTuning\1\2", str) + if re.search (r'[^-\w]staff-padding[^-\w]', str): + stderr_write (NOT_SMART % "staff-padding") + stderr_write (_ ("Staff-padding now controls the distance to the baseline, not the nearest point.")) + return str + +@rule((2, 17, 29), r'''Dynamic_engraver -> New_dynamic_engraver+Dynamic_align_engraver +New_dynamic_engraver -> Dynamic_engraver''') +def conv(str): + str = re.sub ("(\r?\n?[ \t]*\\\\(?:consists|remove)\\s*)(\"?)Dynamic_engraver\\2", + r"\1\2New_dynamic_engraver\2\1\2Dynamic_align_engraver\2", + str) +# Should we warn about any remaining Dynamic_engraver? Possibly it +# will do the job just fine. + str = re.sub ("New_dynamic_engraver", "Dynamic_engraver", str) + return str + +@rule ((2, 17, 97), r'''(make-relative (a b) b ...) -> make-relative (a b) #{ a b #}...''') +def conv (str): + str = re.sub (r"(\(make-relative\s+\(\s*(([A-Za-z][-_A-Za-z0-9]*)" + + r"(?:\s+[A-Za-z][-_A-Za-z0-9]*)*)\s*\)\s*)\3(?=\s)", + r"\1(make-event-chord (list \2))", str) + str = re.sub (r"(\(make-relative\s+\(\s*([A-Za-z][-_A-Za-z0-9]*" + + r"(?:\s+([A-Za-z][-_A-Za-z0-9]*))+)\s*\)\s*)\3(?=\s)", + r"\1(make-sequential-music (list \2))", str) + return str + +@rule ((2, 18, 0), + _ ("bump version for release")) +def conv (str): + return str + +@rule ((2, 19, 2), r"\lyricsto \new/\context/... -> \new/\context/... \lyricsto") +def conv (str): + word=r'(?:#?"[^"]*"|\b' + wordsyntax + r'\b)' + str = re.sub (r"(\\lyricsto\s*" + word + r"\s*)(\\(?:new|context)\s*" + word + + r"(?:\s*=\s*" + word + r")?\s*)", + r"\2\1", str) + str = re.sub (r"(\\lyricsto\s*" + word + r"\s*)\\lyricmode\b\s*", + r"\1", str) + str = re.sub (r"(\\lyricsto\s*" + word + r"\s*)\\lyrics\b\s*", + r"\\new Lyrics \1", str) + str = re.sub (r'\\lyricmode\s*(\\lyricsto\b)', r"\1", str) + return str + +@rule ((2, 19, 7), "keySignature -> keyAlterations") +def conv(str): + str = re.sub (r'\bkeySignature\b', 'keyAlterations', str) + str = re.sub (r'\blastKeySignature\b', 'lastKeyAlterations', str) + str = re.sub (r'\blocalKeySignature\b', 'localAlterations', str) + return str + +@rule ((2, 19, 11), "thin-kern -> segno-kern") +def conv(str): + str = re.sub (r'\bthin-kern\b', 'segno-kern', str) + return str + +# before_id is written in a manner where it will only substantially +# (rather than as a lookbefore assertion) match material that could +# not be part of a previous id. In that manner, one replacement does +# not inhibit an immediately adjacent replacement. + +before_id = r'(?:^|(? initialTimeSignatureVisibility +csharp -> c-sharp""") +def conv(str): + str = re.sub (r'\bimplicitTimeSignatureVisibility\b', 'initialTimeSignatureVisibility', str) + str = re.sub ('(' + before_id + r'[a-g])((?:sharp){1,2}|(?:flat){1,2})' + + after_id, r'\1-\2', str) + return str + +@rule ((2, 19, 22), """(define-xxx-function (parser location ...) -> (define-xxx-function (...) +(xxx ... parser ...) -> (xxx ... ...)""") +def conv(str): + def subst(m): + def subsub(m): + str = (m.group (1) + + re.sub ('(?<=\s|["\\()])' + m.group (2) + r'(?=\s|["\\()])', + r'(*location*)', + re.sub (r'(?<=\s|["\\()])parser(?=\s|["\\()])', + r'(*parser*)', m.group (3)))) + return str + return re.sub (r'(\([-a-z]+\s*\(+)parser\s+([-a-z]+)\s*((?:.|\n)*)$', + subsub, m.group (0)) + str = re.sub (r'\(define-(?:music|event|scheme|void)-function(?=\s|["(])' + + paren_matcher (20) + r'\)', subst, str) + + def repl (m): + return m.group (1) + inner (m.group (2)) + def inner (str): + str = re.sub (r"(\((?:" + + r"ly:parser-lexer|" + + r"ly:parser-clone|" + + r"ly:parser-output-name|" + + r"ly:parser-error|" + + r"ly:parser-define!|" + + r"ly:parser-lookup|" + + r"ly:parser-has-error\?|" + + r"ly:parser-clear-error|" + + r"ly:parser-set-note-names|" + + r"ly:parser-include-string|" + + r"note-names-language|" + + r"display-lily-music|" + + r"music->lily-string|" + + r"note-name->lily-string|" + + r"value->lily-string|" + r"check-grob-path|" + + r"event-chord-wrap!|" + + r"collect-bookpart-for-book|" + + r"collect-scores-for-book|" + + r"collect-music-aux|" + + r"collect-book-music-for-book|" + + r"scorify-music|" + + r"collect-music-for-book|" + + r"collect-book-music-for-book|" + + r"toplevel-book-handler|" + + r"default-toplevel-book-handler|" + + r"print-book-with-defaults|" + + r"toplevel-music-handler|" + + r"toplevel-score-handler|" + + r"toplevel-text-handler|" + + r"toplevel-bookpart-handler|" + + r"book-music-handler|" + + r"context-mod-music-handler|" + + r"bookpart-music-handler|" + + r"output-def-music-handler|" + + r"print-book-with-defaults-as-systems|" + + r"add-score|" + + r"add-text|" + + r"add-music|" + + r"make-part-combine-music|" + + r"make-directed-part-combine-music|" + + r"add-quotable|" + + r"paper-variable|" + + r"make-autochange-music|" + + r"context-mod-from-music|" + + r"context-defs-from-music)" + + r'(?=\s|[()]))(' + paren_matcher (20) + ")" + r"(?:\s+parser(?=\s|[()])|\s*\(\*parser\*\))", repl, str) + return str + return inner (str) + # Guidelines to write rules (please keep this at the end of this file) # # - keep at most one rule per version; if several conversions should be done,