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