]> git.donarmstrong.com Git - lilypond.git/blobdiff - python/convertrules.py
Some more issue 3229 rules
[lilypond.git] / python / convertrules.py
index a1c8d507a648a7d31df0e0e150a0badb7449ace2..9f628e60b631ba2a3c72a92b33c8d99440607e25 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 # (setq py-indent-offset 4)
 
 
@@ -2845,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
 
@@ -3174,7 +3175,7 @@ def conv (str):
 def conv (str):
     str = re.sub (r"Stem\s+#'flag-style", r"Flag #'style", str)
     str = re.sub (r"Stem\s+#'stroke-style", r"Flag #'stroke-style", str)
-    str = re.sub (r"Stem\s+#'flag", r"Flag #'print", str)
+    str = re.sub (r"Stem\s+#'flag", r"Flag #'stencil", str)
     str = re.sub (r"(\s+(?:\\once\s*)?)\\override\s+Stem\s+#'transparent\s*=\s*##t", r"\g<1>\\override Stem #'transparent = ##t\g<1>\\override Flag #'transparent = ##t", str)
     str = re.sub (r"(\s+(?:\\once\s*)?)\\revert\s*Stem\s+#'transparent", r"\g<1>\\revert Stem #'transparent\g<1>\\revert Flag #'transparent", str)
     str = re.sub (r"(\s+(?:\\once\s*)?)\\override\s+Stem\s+#'stencil\s*=\s*##f", r"\g<1>\\override Stem #'stencil = ##f\g<1>\\override Flag #'stencil = ##f", str)
@@ -3297,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):
@@ -3449,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))
@@ -3520,6 +3524,283 @@ 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):
+    if re.search (r"[#$]\(ly:set-option\s+'old-relative", str):
+        stderr_write (NOT_SMART % "#(ly:set-option 'old-relative)")
+        stderr_write (UPDATE_MANUALLY)
+        raise FatalConversionError ();
+    # If the file contains a language switch to a language where the
+    # name of c is not "c", we can't reliably know which parts of the
+    # file will need "c" and which need "do".
+    m = re.search (r'\\language\s(?!\s*#?"(?:nederlands|deutsch|english|norsk|suomi|svenska))"', str)
+    if m:
+        # Heuristic: if there is a non-commented { before the language
+        # selection, we can't be sure.
+        # Also if there is any selection of a non-do language.
+        if (re.search ("^[^%\n]*\\{", m.string[:m.start()], re.M)
+            or re.search ('\\language\s(?!\s*#?"(?:catalan|espanol|español|italiano|français|portugues|vlaams))"', str)):
+            do = "$(ly:make-pitch 0 0)"
+        else:
+            do = "do'"
+    else:
+        do = "c'"
+    str = re.sub (r"(\\relative)(\s+(\{|[\\<]))",
+                  r"\1 " + do + r"\2", str)
+    return str
+
+@rule ((2, 17, 18),
+    "Rename OctavateEight to ClefModifier, rename related properties.")
+def conv(str):
+    str = re.sub ('OctavateEight',               'ClefModifier',                   str)
+    str = re.sub ('octavate-eight-interface',    'clef-modifier-interface',        str)
+    str = re.sub ('clefOctavation',              'clefTransposition',              str)
+    str = re.sub ('clefOctavationFormatter',     'clefTranspositionFormatter',     str)
+    str = re.sub ('clefOctavationStyle',         'clefTranspositionStyle',         str)
+    str = re.sub ('cueClefOctavation',           'cueClefTransposition',           str)
+    str = re.sub ('cueClefOctavationFormatter',  'cueClefTranspositionFormatter',  str)
+    str = re.sub ('cueClefOctavationStyle',      'cueClefTranspositionStyle',      str)
+    return str
+
+@rule((2, 17, 19), r"\column { \vspace #2 } -> \column { \combine \null \vspace #2 }")
+def conv(str):
+    def vspace_replace(m):
+
+# vspace now always adds space and does not, for example, change the
+# impact of either baselineskip or descenders on the line above.
+#
+# We can't simulate the old behavior in a simpler manner.  A command
+# of its own is not really warranted since this behavior combines
+# badly enough with other spacing considerations (like baselineskip
+# and descenders) as to make it not all that useful.  So this
+# conversion rule is here more for compatibility's sake rather than
+# preserving desirable behavior.
+
+        str = re.sub (r"(\\\\?)vspace(\s)", r"\1combine \1null \1vspace\2", m.group(0))
+        return str
+
+    str = re.sub (r"\\(?:left-|right-|center-|)column\s*\{" + brace_matcher (20) + r"\}",
+                  vspace_replace, str)
+    return str
+
+@rule((2, 17, 20), _(r"Flag.transparent and Flag.color inherit from Stem"))
+def conv(str):
+    str = re.sub (r"(((?:\\once\s*)?)\\override\s+((?:\w+\.)?)Stem\.(transparent|color)\s*=\s*(#\S+))\s+\2\\override\s+\3Flag\.\4\s*=\s*\5",
+                  r"\1", str)
+    str = re.sub (r"(((?:\\once\s*)?)\\revert\s+((?:\w+\.)?)Stem\.(transparent|color))\s+\2\\revert\s+\3Flag\.\4",
+                  r"\1", str)
+    str = re.sub (r"(\\tweak\s+((?:\w+\.)?)Stem\.(transparent|color)\s+(#\S+))\s+\\tweak\s+\2Flag\.\3\s+\4",
+                  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'(?:^|(?<!\\)(?:\\\\)+|(?<=[^-_\\a-zA-Z])|(?<=[^a-zA-Z][-_]))'
+
+# after_id is a pure lookbehind assertion so its match string is
+# always empty
+
+after_id = r'(?![a-zA-Z]|[-_][a-zA-Z])'
+
+@rule ((2, 19, 16), """implicitTimeSignatureVisibility -> 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, 21), r"""\relative x''' { y ... -> \relative { z''' ...""")
+def conv(str):
+    # If the file contains a language switch to a language where the
+    # name of c is not "c", we can't reliably convert.
+    m = re.search (r'\\language\s(?!\s*#?"(?:nederlands|deutsch|english|norsk|suomi|svenska))"', str)
+    if True: # not m:
+        def subst(m):
+            oct = (len (re.findall ("'", m.group (1) + m.group (4)))
+                      - len (re.findall (",", m.group (1) + m.group (4))))
+            if (re.search (m.group (1)[0] + r".{7,}" + m.group (3)[0],
+                          "c d e f g a bh")):
+                oct = oct - 1
+            elif (re.search (m.group (3)[0] + r".{7,}" + m.group (1)[0],
+                            "c d e f g a bh")):
+                oct = oct + 1
+            return m.expand (r"\\relative\2\3" + oct * "'" + (-oct) * ",")
+        str = re.sub (r"\\relative\s+([a-z]+[',]*)"
+                      + r"(\s+(?:@?\{|<<?|"
+                      + r"\\(?:new|context)\s+[a-zA-Z]+(?:\s*=\s*"
+                      + matchstring + r")?\s(?:\s*\\with\s*@?\{"
+                      + brace_matcher (10) + r"@?\})?)"
+                      + r"(?:@?\{|<<?|\s|"
+                      + r"%.*\n|"
+                      + r"\\(?:scaleDurations|times)\s*[0-9]+/[0-9]+\s|"
+                      + r"\\tuplet\s*[0-9]+/[0-9]+\s(?:\s*[0-9]+\.*(?:\*[0-9]+)?\s)?|"
+                      + r"\\(?:new|context)\s+[a-zA-Z]+(?:\s*=\s*"
+                      + matchstring + r")?\s(?:\s*\\with\s*@?\{"
+                      + brace_matcher (10) + r"@?\})?|"
+                      + r"\\clef\s+(?:[a-z]+\s|" + matchstring + ")|"
+                      + r"\\key\s+[a-z]+\s*\\[a-z]+\s|"
+                      + r"\\time(?:" + matcharg + r")?\s+[0-9]+/[0-9]+\s|"
+                      + r"\\compoundMeter" + matcharg + r"\s|"
+                      + r"\||[rsR](?:[0-9]+\.*(?:\*[0-9]+)?)?|"
+                      + r"\\partial\s*[0-9]+\.*(?:\*[0-9]+)?|"
+                      + r"\\voice(?:One|Two|Three|Four)(?:Style)?\s|"
+                      + r"\\oneVoice\s|"
+                      + r"\\(?:dots|dynamic|stem|slur|tie|tuplet|phrasingSlur|textSpanner)(?:Up|Down|Neutral)\s|"
+                      + r"\\repeat\s+[a-z]+\s+[0-9]+\s|"
+                      + r"\\autoBeam(?:On|Off)\s|"
+                      + r"\\chordRepeats" + matcharg + "|"
+                      + r"\\tempo\s+(?:" + matchmarkup
+                      + r"(?:\s*[0-9]+\.*\s*=\s*[0-9]+)?|[0-9]+\.*\s*=\s*[0-9]+)\s|"
+                      # ancient music
+                      + r"\\[][]|"
+                      + r"\\(?:virga|stropha|inclinatum|auctum|descendens|"
+                      + r"ascendens|oriscus|quilisma|deminutum|cavum|linea)\s|"
+                      # Some dubious rules
+                      + r"\\global\s|"
+                      + r"(?:\\once\s*|\\temporary\s*)?"
+                      + r"\\(?:(?:unset|revert|hide|omit|accidentalStyle)\s.*\n|"
+                      + r"(?:set|override)\s[^=]*=" + matcharg + r"\s)"
+                      + r")*)([a-h][a-z]*)([',]*)",
+                      subst, str)
+    return 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,