]> git.donarmstrong.com Git - lilypond.git/blob - bin/convert-mudela.py
9654db93779f98af355f7916f5863c91619a018e
[lilypond.git] / bin / convert-mudela.py
1 #!@PYTHON@ -w
2 # -*-perl-*-
3
4 version = "0.2";
5
6 ################################################################
7
8 sub no_conv
9 {
10 }
11  
12 sub convert_0_0_52_to_0_0_53
13 {
14
15     s/include \"/$1\\include \"/g;
16 }
17
18   
19 sub convert_0_0_54_to_0_0_55
20 {
21     s/%{/% {/g;
22 }
23
24   
25 sub convert_0_0_53_to_0_0_54
26 {
27     print STDERR "Not smart enough to convert \\transpose\n"    if (/\\transpose/) ;
28 }
29
30 # we-re not at 58 yet, but this is at least one of the rules
31 sub convert_0_0_55_to_0_0_56
32 {
33     s/\"\|\|\"/\"|.\"/g;
34 }
35
36 sub convert_0_0_56_to_0_0_57
37 {
38     s/\(([ \]\[|\t-\.>]|\\[<!>a-z]+)*\)/\~ $1/g;
39 }
40
41 sub convert_0_0_57_to_0_0_58
42 {
43     s/\[ *([^\[\]]*)\] *([1-9]*) *\/ *([1-9]*)/[$2\/$3 $1]1\/1/g;
44 }
45
46 sub convert_0_0_58_to_0_0_59
47 {
48     die "Not smart enough to convert 0.0.58 to 0.0.59\n";
49 }
50
51 sub convert_0_0_59_to_0_0_60
52 {
53     s/(\\unitspace [0-9.mcptin\\ ]+|\\geometric [0-9.]+|\\width [0-9.mcp\\tin]+)/$1;/g;
54     s/(\\output \"[^\"]+\")/$1;/;
55     s/(\\tempo  [0-9: ]+)/$1;/;
56 }
57
58 sub convert_0_0_60_to_0_0_61
59 {
60     s/(\\unitspace|\\geometric|\\width)/$1=/g;
61    
62 }
63
64 sub convert_0_1_0_to_0_1_1
65 {
66     s/\\tempo (.*):(.*);/\\tempo $1 = $2;/g
67 }
68
69 sub convert_0_1_2_to_0_1_3
70 {
71     s/\\stem *(\\up|1) *;/\\stemup/g;
72     s/\\stem *(\\down|-1) *;/\\stemdown/g;
73     s/\\stem *0 *;/\\stemboth/g;
74     s/\\hshift ([^;]+) *;/\\property Voice.hshift = $1/g;
75 }
76
77 my $header_b = 0;
78
79 sub generic_conversion_scan
80 {
81     if (/\\header *\{/)
82     {
83         $header_b = 1;
84     }
85     if ($header_b && /^ *\}/)
86     {
87         $header_b = 0;
88     }
89 }
90 sub convert_0_1_4_to_0_1_5
91 {
92     s/([<{]) *\\id "Piano" (.+);/\\type Grandstaff = $3 $1/;    
93     s/([<{]) *\\id (.+) (.+);/\\type $2 = $3 $1/;
94 }
95
96        
97 sub convert_0_1_5_to_0_1_6
98 {
99     s/< *\\multi (.*);/\\multi $1 </;
100 }
101
102 sub convert_0_1_6_to_0_1_7
103 {
104     if ($header_b) 
105     {
106         s/^([a-zA-z]+)[ \t]+(.*)$/$1 =\t \"$2\";/;
107         s/^([ \t])+(.*)$/$1 \"$2\";/;
108     }
109 }  
110
111 sub convert_0_1_7_to_0_1_8
112 {
113     s/\\plet *1 *\/ *1 *;/\\]/;    
114     s/\\plet *([1-9][0-9]*) *\/ *([2-9][0-9]*) *;/\\[$1\/$2/;    
115 }  
116
117 sub convert_0_1_8_to_0_1_9
118 {
119 # sticky plet shorthand...
120 #  print "introduced plet and finger shorthands...\n";
121 }
122
123 ###############################################################
124
125 sub    last_conversion
126 {
127     my @v = &versions;
128     return pop @v;
129 }
130 sub identify
131 {
132     
133     print STDERR "This is convert-mudela " . $convert_mudela_version . 
134         " (up to mudela version ", last_conversion,     ")\n";
135 }
136   
137   
138  sub usage
139   {
140      print STDERR "Usage: convert-mudela [options] [mudela-file]...\n"
141      . "Convert old mudela source from mudela-file or stdin\n\n"
142      . "Options:\n"
143      . "  -e, --edit             perform in-place conversion\n"
144      . "  -f, --from=PATHLEVEL   use source version 0.0.PATCHLEVEL\n"
145      . "  -h, --help             print this help\n"
146      . "  -o, --output=FILE      name output file\n"
147      . "  -s, --show-rules       print all known conversion rules\n"
148      . "  -t, --to=VERSION       convert to version VERSION\n"
149   }
150       
151
152 my %minor_conversions = ("0.0.50" => \&no_conv,
153                          "0.0.52" => \&convert_0_0_50_to_0_0_52,
154                          "0.0.53" => \&convert_0_0_52_to_0_0_53,
155                          "0.0.54" => \&convert_0_0_53_to_0_0_54,
156                          "0.0.55" => \&convert_0_0_54_to_0_0_55,
157                          "0.0.56" => \&convert_0_0_55_to_0_0_56,
158                          "0.0.57" => \&convert_0_0_56_to_0_0_57,
159                          "0.0.58" => \&convert_0_0_57_to_0_0_58,
160                          "0.0.59" => \&convert_0_0_58_to_0_0_59,
161                          "0.0.60" => \&convert_0_0_59_to_0_0_60,
162                          "0.0.61" => \&convert_0_0_60_to_0_0_61,
163                          "0.1.1" => \&convert_0_1_0_to_0_1_1,
164                          "0.1.2" => \&no_conv,
165                          "0.1.3" => \&convert_0_1_2_to_0_1_3,
166                          "0.1.4" => \&no_conv,
167                          "0.1.5" => \&convert_0_1_4_to_0_1_5,
168                          "0.1.6" => \&convert_0_1_5_to_0_1_6
169                          ,"0.1.7" => \&convert_0_1_6_to_0_1_7
170                          ,"0.1.8" => \&convert_0_1_7_to_0_1_8
171                          ,"0.1.9" => \&convert_0_1_8_to_0_1_9
172                          );
173
174  
175
176 sub versions 
177 {
178     return (sort { cmpver; } (keys %minor_conversions));
179 }
180
181
182 sub show_rules
183 {
184     my (@v) = versions;
185
186     print "Rules: ", join(", ", @v), "\n";
187     
188 }
189
190 sub do_conversion
191 {
192     my ($from,$to) = @_;
193
194     my @applicable_conversion;
195     my @mudela_levels;
196     
197     my @v = versions;
198     foreach $ver (@v) {
199         if (version_compare($ver, $from) > 0 && version_compare($ver,$to) <= 0 ){ 
200             push @applicable_conversion, $minor_conversions{$ver};
201             push @mudela_levels, $ver;
202         }
203     }
204     
205     print STDERR "Applying following rules: ", join(", ", @mudela_levels) , "\n";
206
207     while (<INLY>) {
208         generic_conversion_scan;
209         foreach $subroutine (@applicable_conversion) {
210         
211             &$subroutine;
212             
213         }
214         version_string_conv $from, $to;
215         print OUTLY;
216     }
217 }
218
219 sub get_auto_from
220 {
221     my ($fn)=@_;
222     my ($ver);
223     open INLY, $fn || die "Can't open";
224
225     while (<INLY>) {
226         s/^.*\\version \"([^\"]*)\".*$//;
227         if (defined ($1)) {
228             print STDERR "Guessing version: ", $1, ".. ";
229             $ver = $1;
230             last;
231         }
232     }
233     if (!defined($ver)){
234         print STDERR "can't determine mudela version in $fn.\n";
235         my $u;
236         return $u;
237     }
238     close INLY;
239     return $ver;
240 }   
241
242 sub  set_files 
243 {
244     $infile = "-";
245     $outfile = "-";
246     $outfile = $opt_output if (defined($opt_output));
247
248     if ($ARGV [0])  {
249         $infile = $ARGV[0];
250     } 
251     if (!(-f $infile) && !($infile =~ /\.ly$/s)) {
252         $infile .= ".ly";
253     }
254     if ($opt_edit && $infile ne "-") {
255         $opt_edit = 1;
256         $outfile = "$infile.NEW";
257         $infile = "$infile";
258     }
259     print STDERR "Input ", (($infile eq "-") ?"STDIN" : $infile), " .. ";
260
261 }
262
263 sub do_one_arg
264 {
265     set_files;
266
267     local ($from_version, $to_version);
268     $from_version = $opt_from;
269     $to_version = $opt_to;
270     
271     ($from_version = get_auto_from $infile) unless defined($opt_from);
272     return if (!defined($from_version));
273     
274     ($to_version =  last_conversion) unless (defined($opt_to));
275
276     die "can't open \`$infile\'" unless open INLY,$infile ;
277     die "can't open \`$outfile\'" unless open OUTLY, ">$outfile";
278     
279     do_conversion $from_version, $to_version;
280     close INLY;
281     close OUTLY;
282
283     if ($opt_edit) {
284         rename $infile, "$infile~";
285         rename $outfile, "$infile";
286     }
287 }
288
289 ## "main"
290
291 identify;
292
293
294 GetOptions ("help", "output=s", "from=i", "to=i", "minor=i", "edit", "show-rules");
295
296 if ($opt_help) {
297     usage();
298     $opt_help = 0;      # to extinguish typo check.
299     exit 0;
300 }
301
302 if ($opt_show_rules) { 
303     show_rules ;
304     $opt_show_rules = 0;        # to extinguish typo check.
305     exit 0;
306 }
307
308 local ( $infile,$outfile);
309 my $processed_one=0;
310
311 while (defined($ARGV[0])) {
312     do_one_arg;
313     shift @ARGV;
314     $processed_one = 1;
315 }
316 do_one_arg unless ($processed_one);
317
318