]> git.donarmstrong.com Git - lilypond.git/blob - scripts/mudela-book.py
release: 1.0.4
[lilypond.git] / scripts / mudela-book.py
1
2 # python version of mudela-book.  WIP.
3
4 #  TODO: center option
5
6 # log:
7
8 # 0.3:
9 #   rewrite in Python.
10
11 import os
12 import string
13 import regex
14 import getopt
15 import sys
16 import regsub
17
18 outdir = 'out/'
19 program_version = '0.3'
20
21
22
23
24 def file_exist_b(name):
25     try: 
26         f = open(name)
27     except IOError:
28         return 0
29     f.close ()
30     return 1
31
32 class CompileStatus:
33         pass
34
35 def file_mtime (name):
36     return os.stat (name)[8] #mod time
37
38 def compile (command, infile, outfile):
39         indate = file_mtime (infile)
40         try:
41                 outdate = file_mtime (outfile)
42                 recompile = indate > outdate
43
44         except os.error:
45                 recompile = 1
46
47         if recompile:
48                 sys.stderr.write ('invoking `%s\'\n' % command)
49                 
50                 status = os.system (command)
51                 if status:
52                         raise CompileStatus
53
54
55 class Mudela_output:
56         def __init__ (self):
57                 self.basename = ''
58                 self.fragment = 0
59                 self.size = 16
60                 
61         def open (self, basename):
62                 self.basename = basename
63                 self.temp_file = "%s/%s" %(outdir, 'mudela-temp.ly')
64                 self.file = open (self.temp_file, 'w')
65                 self.file.write ('\\include \"paper%d.ly\"\n' % self.size)
66                 if self.size == 16:
67                         s = 'sixteen'
68                 else:
69                         s = 'twenty'
70
71                 self.file.write ('default_paper = \\paper { \\paper_%s\n linewidth = -15.\\cm; }\n' % s)
72                 
73                 if self.fragment:
74                         self.file.write ('\\score { \\melodic { ')
75
76         def write (self,s):
77                 self.file.write (s)
78
79         def close (self):
80                 if self.fragment:
81                         self.file.write (
82                                 '}\n \\paper { linewidth = -1.0\\cm;\n' +
83                                 'castingalgorithm = \\Wordwrap; } }\n')
84
85
86                 self.file.close ()
87
88                 inf=self.basename + '.ly'
89                 outf = self.basename + '.tex'           
90                 if not file_exist_b (inf):
91                         status = 1
92                 else:
93 #                       print 'invoking %s' %('diff %s %s' % (self.temp_file, inf))
94                         status = os.system ('diff -q %s %s' % (self.temp_file, inf))
95 #                       print 'status %d' % status
96
97                 if status:
98                         os.rename (self.temp_file, inf)
99
100                 compile ('lilypond  -o %s %s'%  (self.basename, inf), inf, outf)
101 #                       os.rename (self.basename + '.tex', outdir  +)
102                 
103         
104
105 class Tex_output:
106         def __init__ (self, name):
107                 self.output_fn = '%s/%s' % (outdir, name)
108                 self.mudela = 0
109                 self.file = open (self.output_fn , 'w')
110                 self.verbatim = 0               
111         def open_mudela (self, basename):
112
113                 self.mudela_basename =basename
114                 if self.verbatim:
115                         self.file.write ('\\begin{verbatim}\n')
116                 self.mudela = 1
117
118         def write (self, s):
119                 self.file.write (s)
120                         
121         def write_mudela (self, s):
122                 if self.verbatim:
123                         self.file.write (s)
124                         
125         def close_mudela (self):
126                 if self.verbatim:
127                         self.file.write ('\\end{verbatim}\n')
128                         self.verbatim = 0
129                 
130                 self.file.write (
131                     '\\preMudelaExample\\input %s\n\postMudelaExample' %(self.mudela_basename))
132                 self.mudela = 0
133
134
135
136
137
138 begin_mudela_re = regex.compile ('^ *\\\\begin{mudela}')
139 begin_mudela_opts_re = regex.compile ('^ *\\\\begin{mudela}\[\(.*\)\]')
140 end_mudela_re = regex.compile ('^ *\\\\end{mudela}')
141 section_re = regex.compile ('\\\\section')
142 chapter_re = regex.compile ('\\\\chapter')
143
144
145 class Tex_input:
146         def __init__ (self, name, outname):
147                 self.infile = open (name)
148                 self.outname = outname
149                 self.chapter = 0
150                 self.section = 0
151                 self.fine_count =0
152                 self.mudtex = Tex_output (self.outname)
153                 self.mudela = None
154         def set_sections (self, l):
155                 if section_re.search (l) <> -1:
156                         self.section = self.section + 1
157                 if chapter_re.search (l) <> -1:
158                         self.section = 0
159                         self.chapter = self.chapter + 1
160
161                         
162         def gulp_mudela (self):
163                 pass
164
165         def gen_basename (self):
166                 return '%s/%s-%d.%d.%d' % (outdir, self.outname,self.chapter,self.section,self.fine_count)
167         def do_it(self):
168                 lines = self.infile.readlines ()
169                 for line in lines:
170                         if begin_mudela_re.search (line) <> -1:
171                                 if begin_mudela_opts_re.search (line) <> -1:
172                                         opts = begin_mudela_opts_re.group (1)
173                                 else:
174                                         opts = ''
175                                 optlist = string.split (opts, ',')
176                                 self.mudela = Mudela_output ()
177                                 if 'fragment' in optlist:
178                                         self.mudela.fragment = 1
179                                 if '16pt' in optlist:
180                                         self.mudela.size = 16
181                                 if '20pt' in optlist:
182                                         self.mudela.size = 20
183                                 
184                                 if 'verbatim' in optlist:
185                                         self.mudtex.verbatim = 1
186
187                                 b = self.gen_basename ()
188                                 self.mudtex.open_mudela (b)
189                                 self.mudela.open (b)
190
191
192                                 continue
193                         elif end_mudela_re.search (line) <> -1:
194                                 self.mudela.close ()
195                                 self.mudtex.close_mudela ()
196                                 self.mudela = None
197                                 self.fine_count = self.fine_count + 1
198                                 continue
199                             
200                         if self.mudela:
201                                 self.mudela.write (line)
202                                 self.mudtex.write_mudela (line)
203                         else:
204                                 self.mudtex.write (line)
205                         self.set_sections(line)
206                 del self.mudtex
207                 
208
209 def help():
210     sys.stdout.write("Usage: mudela-book [options] FILE\n"
211                  + "Generate hybrid LaTeX input from Latex + mudela"
212                  + "Options:\n"
213                  + "  -h, --help             print this help\n"
214                  + "  -d, --outdir=DIR       prefix directory\n" 
215                  + "  -o, --outname=FILE     prefix for filenames\n"
216                      )
217     sys.exit (0)
218
219
220
221 sys.stderr.write ('This is %s version %s\n' % ('mudela-book', program_version))
222
223 outname = ''
224 (options, files) = getopt.getopt(
225         sys.argv[1:], 'hd:o:', [ 'outdir=', 'outname=', 'help'])
226 for opt in options:
227         o = opt[0]
228         a = opt[1]
229         if o == '--outname' or o == '-o':
230                 outname = a
231         if o == '--outdir' or o == '-d':
232                 outdir = a
233         if o == '--help' or o == '-h':
234                 help ()
235
236
237 for f in files:
238     my_outname = outname
239     if not my_outname:
240         my_outname = regsub.sub ('\\(.*\\)\\.doc', '\\1', f)
241
242     inp = Tex_input (f, my_outname)
243     inp.do_it ()
244         
245
246