3 # convert-mudela.py -- convertor for mudela versions
5 # source file of the GNU LilyPond music typesetter
10 # use -f and -t for -s output
16 program_name = 'convert-mudela'
29 mudela_version_re_str ='\\\\version *\"\(.*\)\"'
30 mudela_version_re = regex.compile(mudela_version_re_str)
33 return '%s version %s' %(program_name, version);
36 sys.stdout.write (program_id () + '\n')
45 print 'can\'t open file: ' + f + '\n'
49 print 'gulped empty file: ' + f + '\n'
55 return tuple (map (atoi, split (s,'.')))
58 return join (map (lambda x: '%s' % x, list (t)), '.')
60 def version_cmp (t1, t2):
67 def guess_mudela_version(filename):
68 s = gulp_file (filename)
69 if mudela_version_re.search(s) <> -1:
70 return mudela_version_re.group(1)
76 ("Usage: %s [OPTION]... [FILE]...\n"
77 + "Try to convert to newer mudela-versions\n"
79 + " -h, --help print this help\n"
80 + ' -e, --edit in place edit\n'
81 + ' -f, --from=VERSION start from version\n'
82 + ' -s, --show-rules print out all rules.\n'
83 + ' -t, --to=VERSION target version\n') % program_name)
86 class FatalConversionError:
91 def show_rules (file):
93 file.write ('%s: %s\n' % (tup_to_str (x[0]), x[2]))
95 ############################
97 if 1: # need new a namespace
101 if regex.search ('\\\\octave', x) <> -1:
105 sys.stderr.write ('\nNot smart enough to convert \\octave\n')
106 raise FatalConversionError()
111 ((0,1,19), conv, 'deprecated \\octave; can\'t convert automatically'))
114 if 1: # need new a namespace
118 x = regsub.gsub ('\\\\textstyle\\([^;]+\\);',
119 '\\\\property Lyrics . textstyle = \\1', x)
120 x = regsub.gsub ('\\\\key\\([^;]+\\);', '\\\\accidentals \\1;', x)
126 ((0,1,20), conv, 'deprecated \\textstyle, new \key syntax'))
129 if 1: # need new a namespace
133 x = regsub.gsub ('\\\\musical_pitch',
134 '\\\\musicalpitch',x)
135 x = regsub.gsub ('\\\\meter',
142 ((0,1,21), conv, '\\musical_pitch -> \\musicalpitch, '+
143 '\\meter -> \\time\n'))
145 if 1: # need new a namespace
150 ((1,0,0), conv, '0.1.21 -> 1.0.0 '))
154 ############################
156 def get_conversions (from_version, to_version):
157 def version_b (v, f = from_version, t = to_version):
158 return version_cmp (v[0], f) > 0 and version_cmp (v[0], t) <= 0
159 return filter (version_b, conversions)
162 def latest_version ():
163 return conversions[-1][0]
165 def do_conversion (infile, from_version, outfile, to_version):
167 conv_list = get_conversions (from_version, to_version)
169 sys.stderr.write ('Applying conversions: ')
170 lines = infile.readlines();
174 sys.stderr.write (tup_to_str (x[0]) + ', ')
176 last_conversion = x[0]
178 sys.stderr.write ('\n')
180 except FatalConversionError:
181 sys.stderr.write ('Error while converting; I won\'t convert any further')
185 x = regsub.sub (mudela_version_re_str, '\\version \"%s\"' % tup_to_str (last_conversion), x)
188 class UnknownVersion:
191 def do_one_file (infile_name):
194 outfile_name = infile_name + '.NEW'
195 elif __main__.outfile_name:
196 outfile_name = __main__.outfile_name
198 if __main__.from_version:
199 from_version = __main__.from_version
201 guess = guess_mudela_version (infile_name)
203 raise UnknownVersion()
204 from_version = str_to_tuple (guess)
206 if __main__.to_version:
207 to_version = __main__.to_version
209 to_version = latest_version ()
213 infile = open (infile_name,'r')
218 outfile = open (outfile_name, 'w')
223 do_conversion (infile, from_version, outfile, to_version)
226 os.rename (infile_name, infile_name + '~')
227 os.rename (infile_name + '.NEW', infile_name)
236 (options, files) = getopt.getopt (
237 sys.argv[1:], 'f:t:seh', ['show-rules', 'help', 'edit', 'from', 'to'])
242 if o== '--help' or o == '-h':
244 elif o== '--from' or o=='-f':
245 from_version = str_to_tuple (a)
246 elif o== '--to' or o=='-t':
247 to_version = str_to_tuple (a)
248 elif o== '--edit' or o == '-e':
250 elif o== '--show-rules' or o == '-s':
251 show_rules (sys.stdout)
263 except UnknownVersion: