X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=python%2Fconvertrules.py;h=b0a46ebac8de9e357cfbc9271f9c45cc3c6b346d;hb=dc3f0fb1d5c586f44489dd0f8e999233a8d15ede;hp=e3d5dd65d0c5c14cd7e954f96dc6264de1cf5f7c;hpb=08e0e65cb2905bfe9ded5407662d9af3b0b99283;p=lilypond.git diff --git a/python/convertrules.py b/python/convertrules.py index e3d5dd65d0..b0a46ebac8 100644 --- a/python/convertrules.py +++ b/python/convertrules.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # (setq py-indent-offset 4) @@ -3373,6 +3374,179 @@ def conv (str): str = re.sub (r"(\\set\s+)stringTuning", r"\1Staff.stringTuning", str) return str +wordsyntax = r"[a-zA-Z\200-\377](?:[-_]?[a-zA-Z\200-\377])*" + +@rule ((2, 15, 43), r'"custom-tuning" = -> custom-tuning =') +def conv (str): + str = re.sub ('\n"(' + wordsyntax + r')"(\s*=\s*\\stringTuning)', "\n\\1\\2", str) + return str + +@rule ((2, 16, 0), + _ ("bump version for release")) +def conv (str): + return str + +@rule ((2, 17, 0), r"blank-*-force -> blank-*-penalty") +def conv (str): + str = re.sub ('blank-page-force', 'blank-page-penalty', str) + str = re.sub ('blank-last-page-force', 'blank-last-page-penalty', str) + str = re.sub ('blank-after-score-page-force', 'blank-after-score-page-penalty', str) + return str + + +@rule ((2, 17, 4), r"\shape Grob #offsets -> \shape #offsets Grob") +def conv (str): + str = re.sub (r"\\shape(\s+(?:[a-zA-Z]+|" + matchstring + "))(" + + matcharg + ")", r"\\shape\2\1", str) + return str + +barstring=r"(\\bar|whichBar|defaultBarType|segnoType|doubleRepeatType|startRepeatType|endRepeatType|doubleRepeatSegnoType|startRepeatSegnoType|endRepeatSegnoType)(\s*[=]?\s*[#]?)" + +@rule ((2, 17, 5), r"New bar line interface") +def conv(str): + str = re.sub (barstring + r'"\|:"', '\\1\\2".|:"', str) + str = re.sub (barstring + r'":\|"', '\\1\\2":|."', str) + str = re.sub (barstring + r'"\|\|:"', '\\1\\2".|:-||"', str) + str = re.sub (barstring + r'":\|:"', '\\1\\2":..:"', str) + str = re.sub (barstring + r'"\.\|\."', '\\1\\2".."', str) + str = re.sub (barstring + r'"\|S"', '\\1\\2"S-|"', str) + str = re.sub (barstring + r'"S\|"', '\\1\\2"S-S"', str) + str = re.sub (barstring + r'":\|S"', '\\1\\2":|.S"', str) + str = re.sub (barstring + r'":\|S\."', '\\1\\2":|.S-S"', str) + str = re.sub (barstring + r'"S\|:"', '\\1\\2"S.|:-S"', str) + str = re.sub (barstring + r'"\.S\|:"', '\\1\\2"S.|:"', str) + str = re.sub (barstring + r'":\|S\|:"', '\\1\\2":|.S.|:"', str) + str = re.sub (barstring + r'":\|S\.\|:"', '\\1\\2":|.S.|:-S"', str) + str = re.sub (barstring + r'":"', '\\1\\2";"', str) + str = re.sub (barstring + r'"\|s"', '\\1\\2"|-s"', str) + str = re.sub (barstring + r'"dashed"', '\\1\\2"!"', str) + str = re.sub (barstring + r'"kievan"', '\\1\\2"k"', str) + str = re.sub (barstring + r'"empty"', '\\1\\2"-"', str) + return str + +symbol_list = (r"#'(?:" + wordsyntax + r"|\(\s*(?:" + wordsyntax + r"\s+)*" + + wordsyntax + r"\s*\))") + +grob_path = r"(?:" + symbol_list + r"\s+)*" + symbol_list + +grob_spec = wordsyntax + r"(?:\s*\.\s*" + wordsyntax + r")?" + +def path_replace (m): + return m.group (1) + string.join (re.findall (wordsyntax, m.group (2)), ".") + +@rule ((2, 17, 6), r"""\accidentalStyle #'Context "style" -> \accidentalStyle Context.style +\alterBroken "Context.grob" -> \alterBroken Context.grob +\overrideProperty "Context.grob" -> \overrideProperty Context.grob +\tweak Grob #'symbol -> \tweak Grob.symbol""") +def conv (str): + def patrep (m): + def fn_path_replace (m): + x = string.join (re.findall (wordsyntax, m.group (2)), ".") + if x in ["TimeSignature", "KeySignature", "BarLine", + "Clef", "StaffSymbol", "OttavaBracket", + "LedgerLineSpanner"]: + x = "Staff." + x + return m.group (1) + x + 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)) + + if not m.group (5): + x = r"\single" + x + return x + + str = re.sub (r'''(\\accidentalStyle\s+)#?"([-A-Za-z]+)"''', + r"\1\2", str) + str = re.sub (r'''(\\accidentalStyle\s+)#'([A-Za-z]+)\s+#?"?([-A-Za-z]+)"?''', + r"\1\2.\3", str) + str = re.sub (r'''(\\(?:alterBroken|overrideProperty)\s+)#?"([A-Za-z]+)\s*\.\s*([A-Za-z]+)"''', + r"\1\2.\3", str) + str = re.sub (r'''(\\tweak\s+)#?"?([A-Za-z]+)"?\s+?#'([-A-Za-z]+)''', + r"\1\2.\3", str) + str = re.sub (r'''(\\tweak\s+)#'([-A-Za-z]+)''', + r"\1\2", str) + str = re.sub ("(" + matchmarkup + ")|" + + r"(\\footnote(?:\s*" + + matchmarkup + ")?" + matcharg + ")(" + matcharg + + r")?(\s+" + matchmarkup + r")(\s+\\default)?", + patrep, str) + str = re.sub (r'''(\\alterBroken)(\s+[A-Za-z.]+)(''' + matcharg + + matcharg + ")", r"\1\3\2", str) + str = re.sub (r"(\\overrideProperty\s+)(" + grob_spec + r"\s+" + grob_path + ")", + path_replace, str) + str = re.sub (r"(\\(?:override|revert)\s+)(" + grob_spec + r"\s+" + grob_path + ")", + path_replace, str) + return str + +@rule ((2, 17, 11), r"""\times -> \tuplet, \set tupletSpannerDuration -> \tupletSpan +(ly:make-moment 1 4) -> (ly:make-moment 1/4) +(ly:make-duration 0 0 1 2) -> (ly:make-duration 0 0 1/2)""") +def conv(str): + def sub_dur (m): + num = int (m.group (1)) + den = int (m.group (2)) + +# if den is no power of 2, don't even try to use an unscaled duration + if (den & (den - 1)) != 0 : + return (r"\tupletSpan 1*%d/%d" % (num, den)) + + if den >= 4 and num == 7 : + return (r"\tupletSpan %d.." % (den/4)) + + if den >= 2 and num == 3 : + return (r"\tupletSpan %d." % (den/2)) + + if num == 1 : + return (r"\tupletSpan %d" % den) + + return (r"\tupletSpan 1*%d/%d" % (num, den)) + + str = re.sub (r"\\set\s+tupletSpannerDuration\s*=\s*" + + r"#\(ly:make-moment\s+([0-9]+)\s+([0-9]+)\s*\)", + sub_dur, str) + str = re.sub (r"\\unset tupletSpannerDuration", + r"\\tupletSpan \\default", str) + str = re.sub (r"\\times(\s*)([0-9]+)/([0-9]+)", + r"\\tuplet\1\3/\2", str) + + str = re.sub (r"(\(ly:make-moment\s+-?[0-9]+)\s+([1-9][0-9]*\))", + r"\1/\2", str) + str = re.sub (r"(\(ly:make-moment\s+-?[0-9]+)\s+([0-9]+\s+-?[0-9]+)\s([0-9]+\))", + r"\1/\2/\3", str) + str = re.sub (r"(\(ly:make-duration\s+-?[0-9]+\s+[0-9]+\s+[0-9]+)\s+([0-9]+\))", + r"\1/\2", 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 + # 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,