]> git.donarmstrong.com Git - lilypond.git/blobdiff - scripts/convert-ly.py
(gui_b): remove wcrtomb checking.
[lilypond.git] / scripts / convert-ly.py
index 8a99c282c06738eec9e2315ba4b96f35a56cb744..4119d0f8f196b2471bcf46d0bfd4c5d94ce515b8 100644 (file)
@@ -123,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 }'))
@@ -192,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 }'))
@@ -225,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
 
@@ -296,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
 
@@ -445,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
 
@@ -473,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)'))
@@ -492,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,
@@ -518,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
 
 
@@ -630,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)
 
@@ -945,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
 
@@ -1427,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)
@@ -1449,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
@@ -1461,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
@@ -1592,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 ()
 
@@ -1988,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)
@@ -2242,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,
@@ -2482,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
@@ -2505,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") \
@@ -2558,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
 
@@ -2637,6 +2736,11 @@ 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)