]> git.donarmstrong.com Git - lilypond.git/blobdiff - scripts/convert-ly.py
(gui_b): remove wcrtomb checking.
[lilypond.git] / scripts / convert-ly.py
index 870310f6a234ddfa5a407ae55890287aa6a5b514..4119d0f8f196b2471bcf46d0bfd4c5d94ce515b8 100644 (file)
@@ -64,6 +64,12 @@ version taken from the \\version command, to the current LilyPond version."""))
   -s, --show-rules       print rules [default: --from=0, --to=@TOPLEVEL_VERSION@]
   -t, --to=VERSION       convert to VERSION [default: @TOPLEVEL_VERSION@]
   -v, --version          print program version"""))
+       sys.stdout.write ('\n\n')
+       sys.stdout.write (_ ('Examples'))
+       sys.stdout.write ('\n')
+       sys.stdout.write ('  convert-ly -e *ly')
+       sys.stdout.write ('\n')
+       sys.stdout.write ('  convert-ly --from=2.4.0 -e $(find . -name "*ly")')
        sys.stdout.write ('\n\n')
        sys.stdout.write (_ ("Report bugs to %s.") % "bug-lilypond@gnu.org")
        sys.stdout.write ('\n')
@@ -117,6 +123,7 @@ if 1:
                if re.search ('\\\\multi', str):
                        sys.stderr.write ('\n')
                        sys.stderr.write (NOT_SMART % "\\multi")
+                       sys.stderr.write ('\n')
                return str
 
        conversions.append (((0,1,9), conv, '\\header { key = concat + with + operator }'))
@@ -186,6 +193,7 @@ if 1:
                if re.search ('\\\\header', str):
                        sys.stderr.write ('\n')
                        sys.stderr.write (NOT_SMART % "new \\header format")
+                       sys.stderr.write ('\n')
                return str
 
        conversions.append (((1,0,2), conv, '\\header { key = concat + with + operator }'))
@@ -219,6 +227,7 @@ if 1:
                if re.search ('[a-zA-Z]+ = *\\translator',str):
                        sys.stderr.write ('\n')
                        sys.stderr.write (NOT_SMART % "\\translator syntax")
+                       sys.stderr.write ('\n')
                #       raise FatalConversionError ()
                return str
 
@@ -290,6 +299,7 @@ if 1:
                if re.search ('\\\\repeat',str):
                        sys.stderr.write ('\n')
                        sys.stderr.write (NOT_SMART % "\\repeat")
+                       sys.stderr.write ('\n')
                #       raise FatalConversionError ()
                return str
 
@@ -439,6 +449,7 @@ if 1:
                if re.search ('\\\\repetitions',str):
                        sys.stderr.write ('\n')
                        sys.stderr.write (NOT_SMART % "\\repetitions")
+                       sys.stderr.write ('\n')
                #       raise FatalConversionError ()
                return str
 
@@ -467,6 +478,7 @@ if 1:
                if re.search ('\\\\notenames',str):
                        sys.stderr.write ('\n')
                        sys.stderr.write (NOT_SMART % "new \\notenames format")
+                       sys.stderr.write ('\n')
                return str
 
        conversions.append (((1,3,38), conv, '\musicalpitch { a b c } -> #\'(a b c)'))
@@ -486,6 +498,7 @@ if 1:
                if re.search ('\\[:',str):
                        sys.stderr.write ('\n')
                        sys.stderr.write (NOT_SMART % "new tremolo format")
+                       sys.stderr.write ('\n')
                return str
 
        conversions.append (((1,3,41), conv,
@@ -512,6 +525,7 @@ if 1:
                if re.search ('\\\\keysignature', str):
                        sys.stderr.write ('\n')
                        sys.stderr.write (NOT_SMART % "new tremolo format")
+                       sys.stderr.write ('\n')
                return str
 
 
@@ -624,6 +638,7 @@ if 1:
                if re.search ('\\\\textscript "[^"]* *"[^"]*"', str):
                        sys.stderr.write ('\n')
                        sys.stderr.write (NOT_SMART % "new \\textscript markup text")
+                       sys.stderr.write ('\n')
 
                str = re.sub ('\\textscript +("[^"]*")', '\\textscript #\\1', str)
 
@@ -939,6 +954,7 @@ if 1:
                       and re.search ('automaticMelismata', str)  == None:
                        sys.stderr.write ('\n')
                        sys.stderr.write (NOT_SMART % "automaticMelismata; turned on by default since 1.5.67.")
+                       sys.stderr.write ('\n')
                        raise FatalConversionError ()
                return str
 
@@ -1421,19 +1437,50 @@ if 1:
                str = re.sub (r'@ACCENT@', '>', str)
                return str
 
+       markup_start = re.compile(r"([-^_]|\\mark)\s*(#\s*'\s*)\(")
+       musicglyph = re.compile(r"\(\s*music\b")
+       columns = re.compile(r"\(\s*columns\b")
+       submarkup_start = re.compile(r"\(\s*([a-zA-Z]+)")
+       leftpar = re.compile(r"\(")
+       rightpar = re.compile(r"\)")
+
        def text_markup (str):
-               str = re.sub (r"""([-_^]) *# *' *\( *music *(\"[^"]*\") *\)""",
-                               r"\1\\markup { \\musicglyph #\2 }", str)
-               str = re.sub (r"""([-_^]) *# *' *\( *([a-z]+) *([^()]*)\)""",
-                               r"\1\\markup { \\\2 \3 }", str)
-               str = re.sub (r"""\\mark *# *' *\( *music *(\"[^"]*\") *\)""",
-                               r"\\mark \\markup { \\musicglyph #\1 }", str)
-               str = re.sub (r"""\\mark *# *' *\( *([a-z]+) *([^()]*)\)""",
-                               r"\\mark \\markup { \\\1 \2 }", str)
-               return str
+               result = ''
+               # Find the beginning of each markup:
+               match = markup_start.search (str)
+               while match:
+                       result = result + str[:match.end (1)] + " \markup"
+                       str = str[match.end( 2):]
+                       # Count matching parentheses to find the end of the 
+                       # current markup:
+                       nesting_level = 0
+                       pars = re.finditer(r"[()]",str)
+                       for par in pars:
+                               if par.group () == '(':
+                                       nesting_level = nesting_level + 1
+                               else:
+                                       nesting_level = nesting_level - 1
+                               if nesting_level == 0:
+                                       markup_end = par.end ()
+                                       break
+                       # The full markup in old syntax:
+                       markup = str[:markup_end]
+                       # Modify to new syntax:
+                       markup = musicglyph.sub (r"{\\musicglyph", markup)
+                       markup = columns.sub (r"{", markup)
+                       markup = submarkup_start.sub (r"{\\\1", markup)
+                       markup = leftpar.sub ("{", markup)
+                       markup = rightpar.sub ("}", markup)
+       
+                       result = result + markup
+                       # Find next markup
+                       str = str[markup_end:]
+                       match = markup_start.search(str)
+               result = result + str
+               return result
 
        def articulation_substitute (str):
-               str = re.sub (r"""([^-])\[ *([a-z]+[,']*[!?]?[0-9:]*\.*)""",
+               str = re.sub (r"""([^-])\[ *(\\?\)?[a-z]+[,']*[!?]?[0-9:]*\.*)""",
                              r"\1 \2[", str)
                str = re.sub (r"""([^-])\\\) *([a-z]+[,']*[!?]?[0-9:]*\.*)""",
                              r"\1 \2\\)", str)
@@ -1443,6 +1490,44 @@ if 1:
                              r"\1 \2\\!", str)
                return str
 
+       string_or_scheme = re.compile ('("(?:[^"\\\\]|\\\\.)*")|(#\\s*\'?\\s*\\()')
+
+       # Only apply articulation_substitute () outside strings and 
+       # Scheme expressions:
+       def smarter_articulation_subst (str):
+               result = ''
+               # Find the beginning of next string or Scheme expr.:
+               match = string_or_scheme.search (str)
+               while match:
+                       # Convert the preceding LilyPond code:
+                       previous_chunk = str[:match.start()]
+                       result = result + articulation_substitute (previous_chunk)
+                       if match.group (1): # Found a string
+                               # Copy the string to output:
+                               result = result + match.group (1)
+                               str = str[match.end(1):]
+                       else: # Found a Scheme expression. Count 
+                               # matching parentheses to find its end
+                               str = str[match.start ():]
+                               nesting_level = 0
+                               pars = re.finditer(r"[()]",str)
+                               for par in pars:
+                                       if par.group () == '(':
+                                               nesting_level = nesting_level + 1
+                                       else:
+                                               nesting_level = nesting_level - 1
+                                       if nesting_level == 0:
+                                               scheme_end = par.end ()
+                                               break
+                               # Copy the Scheme expression to output:
+                               result = result + str[:scheme_end]
+                               str = str[scheme_end:]
+                       # Find next string or Scheme expression:
+                       match = string_or_scheme.search (str)
+               # Convert the remainder of the file
+               result = result + articulation_substitute (str)
+               return result
+
        def conv_relative(str):
                if re.search (r"\\relative", str):
                        str= "#(ly:set-option 'old-relative)\n" + str
@@ -1455,7 +1540,7 @@ if 1:
                str = sub_chords (str)
 
                str = text_markup (str)
-               str = articulation_substitute (str)
+               str = smarter_articulation_subst (str)
                str = re.sub ("@SCM_EOL@", "#'()", str)
 
                return str
@@ -1586,6 +1671,7 @@ def conv (str):
                sys.stderr.write (NOT_SMART % "\\pitch")
                sys.stderr.write ('\n')
                sys.stderr.write ("Use Scheme code to construct arbitrary note events.")
+               sys.stderr.write ('\n')
 
                raise FatalConversionError ()
 
@@ -1982,6 +2068,7 @@ def conv (str):
                sys.stderr.write (NOT_SMART % "ly:paper-get-variable")
                sys.stderr.write ('\n')
                sys.stderr.write ('use (ly:paper-lookup (ly:grob-paper ))')
+               sys.stderr.write ('\n')
                raise FatalConversionError ()
 
        str = re.sub (r'\\defaultAccidentals', "#(set-accidental-style 'default)", str)
@@ -2137,11 +2224,14 @@ conversions.append (((2, 3, 1), conv,
 def conv (str):
        if re.search ('textheight', str):
                sys.stderr.write ('\n')
-               sys.stderr.write (NOT_SMART % "tuning of page layout")
+               sys.stderr.write (NOT_SMART % "textheight")
                sys.stderr.write ('\n')
                sys.stderr.write (UPDATE_MANUALLY)
                sys.stderr.write ('\n')
-
+               sys.stderr.write (
+"""Page layout has been changed, using paper size and margins.
+textheight is no longer used.
+""")
        str = re.sub (r'\\OrchestralScoreContext', '\\Score', str)
        def func(m):
                if m.group(1) not in ['RemoveEmptyStaff',
@@ -2153,7 +2243,6 @@ def conv (str):
 
 
        str = re.sub (r'\\([a-zA-Z]+)Context\b', func, str)
-
        str = re.sub ('ly:paper-lookup', 'ly:output-def-lookup', str)
        return str
 
@@ -2234,7 +2323,7 @@ def conv (str):
        str = re.sub (r'\\applymusic\s*#notes-to-clusters',
                      '\\makeClusters', str)
 
-       str = re.sub (r'pagenumber\s*=', 'firstpagenumber', str)
+       str = re.sub (r'pagenumber\s*=', 'firstpagenumber = ', str)
        return str
 
 conversions.append (((2, 3, 12), conv,
@@ -2474,6 +2563,24 @@ def conv (str):
 conversions.append (((2, 5, 18),
                     conv,
                     'ly:warn -> ly:warning'))
+def conv (str):
+       if re.search ("(override-|revert-)auto-beam-setting", str)\
+          or re.search ("autoBeamSettings", str):
+               sys.stderr.write ('\n')
+               sys.stderr.write (NOT_SMART % "auto beam settings")
+               sys.stderr.write ('\n')
+               sys.stderr.write ('''
+Auto beam settings must now specify each interesting moment in a measure
+explicitely; 1/4 is no longer multiplied to cover moments 1/2 and 3/4 too.
+''')
+               sys.stderr.write (UPDATE_MANUALLY)
+               sys.stderr.write ('\n')
+               raise FatalConversionError ()
+       return str
+
+conversions.append (((2, 5, 21),
+                    conv,
+                    'warn about auto beam settings'))
                    
 ################################
 #      END OF CONVERSIONS
@@ -2497,10 +2604,10 @@ def do_conversion (infile, from_version, outfile, to_version):
        try:
                for x in conv_list:
                        sys.stderr.write (tup_to_str (x[0]))
-                       str = x[1] (str)
-                       last_conversion = x[0]
                        if x != conv_list[-1]:
                                sys.stderr.write (', ')
+                       str = x[1] (str)
+                       last_conversion = x[0]
 
        except FatalConversionError:
                sys.stderr.write (_ ("%s: error while converting") \
@@ -2550,7 +2657,7 @@ def do_one_file (infile_name):
 
 
        if infile_name:
-               infile = open (infile_name,'r')
+               infile = open (infile_name, 'r')
        else:
                infile = sys.stdin
 
@@ -2620,10 +2727,20 @@ if show_rules_p:
        sys.exit (0)
 
 identify ()
+
+if not files:
+       usage ()
+       sys.exit (2)
+
 for f in files:
        if f == '-':
                f = ''
        elif not os.path.isfile (f):
+               sys.stderr.write ('\n')
+               sys.stderr.write (_ ("can't open file: `%s'") % f)
+               sys.stderr.write ('\n')
+               if len (files) == 1:
+                       sys.exit (1)
                continue
        try:
                do_one_file (f)