]> git.donarmstrong.com Git - lilypond.git/blobdiff - python/convertrules.py
Some more issue 3229 rules
[lilypond.git] / python / convertrules.py
index e01ba4bb1aba3998c0adee69cd89760359f7111b..9f628e60b631ba2a3c72a92b33c8d99440607e25 100644 (file)
@@ -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))
@@ -3665,7 +3668,7 @@ def conv(str):
 
 @rule((2, 17, 27), r'''\stringTuning \notemode -> \stringTuning''')
 def conv(str):
-    str = re.sub (r"\\stringTuning\s*\\notemode(\s*)@?\{\s*(.*?)\s*@?}",
+    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")
@@ -3698,29 +3701,7 @@ def conv (str):
 def conv (str):
     return str
 
-# like re.sub, but if the replacement is shorter than the original and
-# the original was followed by at least two spaces, the replacement
-# will be padded in order to take the same space.
-def repadsub (regexp, repl, item):
-    def myownrep (m):
-        res = repl
-        while not isinstance(res, str):
-            res = res (m)
-        res = m.expand (res)
-        if m.string [m.end():m.end()+2] != "  ":
-            return res
-        # if there are newlines in the replaced string, just pad the end
-        lastnlo = str.rfind (m.string, '\n', m.start (), m.end ())
-        lastnlr = str.rfind (res, '\n')
-        if (lastnlo < 0) and (lastnlr < 0):
-            return res + ' ' * (m.end () - m.start () - len (res))
-        if (lastnlo >= 0) and (lastnlr >= 0):
-            return res + ' ' * (m.end () - lastnlo - len (res) + lastnlr)
-        return res
-    return re.sub (regexp, myownrep, item)
-                
-@rule ((2, 19, 2), r"""\lyricsto \new/\context/... -> \new/\context/... \lyricsto
-c4 ~ c2 -> c4 ~ 2""")
+@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
@@ -3731,34 +3712,93 @@ def conv (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
 
-    def repl (m):
-        return m.group (1) + \
-            re.sub (r"(~\s*(?:\|\s*)?)[a-z]+[',]*",
-                    r"\1", m.group (4))
-   
-    str = repadsub (r"(\s([a-z]+)([',]*)!*\?*(?:[0-9]+\.*)?)" +
-                    r"((?:(?:\s|[-^_]?(?:[][()]|\\[()])|[-^_](?:[0-9]+|[->.^_!]))*" +
-                    r"~\s*(?:\|\s*)?\2\3?[0-9]+\.*)+)",
-                    repl, str)
-# The above does not catch the case g4~ g since it only removes note
-# names before durations, not adding any duration.  So we use a
-# different replacement for that.  It matches after an initial
-# notename+duration, a sequence of either duration (left from the
-# previous step) or notename only.
-
-    def repl (m):
-        return m.group (1) + \
-            re.sub (r"(~\s*(?:\|\s*)?)[a-z]+[',]*",
-                    r"\g<1>" + re.sub (r"\\", r"\\\\", m.group(4)), m.group (5))
-   
-    str = repadsub (r"(\s([a-z]+)([',]*)!*\?*([0-9]+\.*))" +
-                    r"((?:(?:\s|[-^_]?(?:[][()]|\\[()])|[-^_](?:[0-9]+|[->.^_!]))*" +
-                    r"~\s*(?:\|\s*)?[0-9]+\.*)*" +
-                    r"(?:(?:\s|[-^_]?(?:[][()]|\\[()])|[-^_](?:[0-9]+|[->.^_!]))*" +
-                    r"~\s*(?:\|\s*)?\2\3?))(?!\s*(?:[!?0-9',]|\\rest))",
-                    repl, 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)