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
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):
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))
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):
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,