-def compile (command, workingdir, infile, outfile):
- "Test if infile is newer than outfile. If so, cd to workingdir"
- "and execute command"
- print "COMPILE!!"
- indate = file_mtime (workingdir+infile)
- try:
- outdate = file_mtime (workingdir+outfile)
- recompile = indate > outdate
-
- except os.error:
- recompile = 1
-
- if recompile:
- sys.stderr.write ('invoking `%s\'\n' % command)
- if workingdir == '':
- status = os.system (command)
- else:
- status = os.system ('cd %s; %s' %(workingdir, command))
- if status:
- raise CompileStatus
-
-class Properties:
- #
- # init
- #
- def __init__(self):
- self.__linewidth = {
- 1: {'a4':{10: 345, 11: 360, 12: 390},
- 'a5':{10: 276, 11: 276, 12: 276},
- 'b5':{10: 345, 11: 356, 12: 356},
- 'letter':{10: 345, 11: 360, 12: 390},
- 'legal': {10: 345, 11: 360, 12: 390},
- 'executive':{10: 345, 11: 360, 12: 379}},
- 2: {'a4':{10: 167, 11: 175, 12: 190},
- 'a5':{10: 133, 11: 133, 12: 133},
- 'b5':{10: 167, 11: 173, 12: 173},
- 'letter':{10: 167, 11: 175, 12: 190},
- 'legal':{10: 167, 11: 175, 12: 190},
- 'executive':{10: 167, 11: 175, 12: 184}}}
- # >0 --> force all mudela to this pt size
- self.force_mudela_fontsize = 0
- self.force_verbatim_b = 0
- self.__data = {
- 'mudela-fontsize' : {'init': 16},
- 'papersize' : {'init': 'a4'},
- 'num-column' : {'init': 1},
- 'tex-fontsize' : {'init': 10}
- }
- def clear_for_new_file(self):
- for var in self.__data.keys():
- self.__data[var] = {'init': self.__data[var]['init']}
- def clear_for_new_block(self):
- for var in self.__data.keys():
- if self.__data[var].has_key('block'):
- del self.__data[var]['block']
- def __get_variable(self, var):
- if self.__data[var].has_key('block'):
- return self.__data[var]['block']
- elif self.__data[var].has_key('file'):
- return self.__data[var]['file']
- else:
- return self.__data[var]['init']
- def setPapersize(self, size, requester):
- self.__data['papersize'][requester] = size
- def getPapersize(self):
- return self.__get_variable('papersize')
- def setMudelaFontsize(self, size, requester):
- self.__data['mudela-fontsize'][requester] = size
- def getMudelaFontsize(self):
- if self.force_mudela_fontsize:
- return self.force_mudela_fontsize
- return self.__get_variable('mudela-fontsize')
- def setTexFontsize(self, size, requester):
- self.__data['tex-fontsize'][requester] = size
- def getTexFontsize(self):
- return self.__get_variable('tex-fontsize')
- def setNumColumn(self, num, requester):
- self.__data['num-column'][requester] = num
- def getNumColumn(self):
- return self.__get_variable('num-column')
- def getLineWidth(self):
- return self.__linewidth[self.getNumColumn()][self.getPapersize()][self.getTexFontsize()]
-
-
-class Mudela_output:
- """ Using only self.code_type to deside both value of linewith and
- if we have to put code into \score{...} was silly. Now we use:
- self.code_type: show us what need to be added.
- None : init value
- 'NOTES' : add \context Voice{ ... }
- 'CONTEXT' : add \score{ ... }
- 'COMPLETE' : jupp
- self.single_line_b: 0 : linewidth=-1 1: linewith=textwidth
- """
- def __init__ (self, basename):
- self.basename = basename
- self.temp_filename = "%s/%s" %(outdir, 'mudela-temp.ly')
- self.file = open (self.temp_filename, 'w')
- self.__lines = []
- # 'tex' or 'eps'
- self.graphic_type = 'tex'
- self.code_type = None
- self.single_line_b = 1
- self.optlist = []
- def write (self, line):
- # match only if there is nothing but whitespace before \begin.
- # we should not have to do this RE for every line
- if re.search('^\s*\\\\begin{mudela}', line):
- r = begin_mudela_opts_re.search(line)
- if r:
- o = r.group()[1:-1]
- self.optlist = re.compile('[\s,]*').split(o)
- else:
- self.optlist = []
- else: # ugh this is NOT bulletproof...
- if not self.code_type:
- if re.search('^\s*%', line) or re.search('^\s*$', line):
- pass
- elif re.search('^\s*\\\\context', line):
- self.code_type = 'CONTEXT'
- self.single_line_b = 0
- elif re.search('^\s*\\\\score', line) or \
- re.search('^\s*\\\\paper', line) or \
- re.search('^\s*\\\\header', line) or \
- re.search('^\s*\\\\version', line) or \
- re.search('^\s*\\\\include', line) or \
- re.search('^\s*[A-Za-z]*\s*=', line):
- self.code_type = 'COMPLETE'
- self.single_line_b = 0
- else:
- self.code_type = 'NOTES'
- self.single_line_b = 1
- self.__lines.append(line)
- def write_red_tape(self):
- if 'eps' in self.optlist:
- self.graphic_type = 'eps'
- #self.single_line_b = 1
- if 'fragment' in self.optlist:
- self.code_type = 'NOTES'
- if 'nonfragment' in self.optlist:
- self.code_type = 'COMPLETE'
- if 'multiline' in self.optlist:
- self.single_line_b = 0
- for pt in fontsize_pt2i.keys():
- if pt in self.optlist:
- Props.setMudelaFontsize(fontsize_pt2i[pt], 'block')
- self.file.write ('\\include \"paper%d.ly\"\n' \
- % Props.getMudelaFontsize())
-
- s = fontsize_i2a[Props.getMudelaFontsize()]
- if 'singleline' in self.optlist:
- self.single_line_b = 1
- if self.single_line_b:
- linewidth_str = 'linewidth = -1.\cm;'
- else:
- linewidth_str = 'linewidth = %i.\\pt;' % Props.getLineWidth()
- self.file.write("\\paper {"
- + "\\paper_%s " % s
- + linewidth_str
- + "castingalgorithm = \Gourlay; \n}\n")
- #+ "castingalgorithm = \Wordwrap; indent = 2.\cm; \n}")
- if self.code_type == 'CONTEXT':
- self.file.write('\\score{\n\\notes\\relative c{')
- if self.code_type == 'NOTES' :
- self.file.write('\\score{\n\\notes\\relative c{\\context Voice{')
- def close (self):
- self.write_red_tape()
- for l in self.__lines:
- self.file.write(l)
- if self.code_type == 'CONTEXT':
- self.file.write('}}')
- elif self.code_type == 'NOTES':
- self.file.write('}}}')
- self.file.close()
-
- inf = outdir + self.basename + '.ly'
- outf = outdir + self.basename + '.tex'
- if not os.path.isfile(inf):
- status = 1
- else:
- status = os.system ('diff -q %s %s' % (self.temp_filename, inf))
- if status:
- os.rename (self.temp_filename, inf)
-
- recompile_b = need_recompile_b(inf, outf)
- if recompile_b:
- out_files.append((self.graphic_type, inf))
- return recompile_b
-
- def insert_me_string(self):
- "ugh the name of this function is wrong"
- if self.graphic_type == 'tex':
- return ['tex', self.basename]
- elif self.graphic_type == 'eps':
- return ['eps', self.basename]
- else:
- raise SomethingIsSeriouslyBroken
-
-class Tex_output:
- def __init__ (self, name):
- self.output_fn = '%s/%s' % (outdir, name)
- self.__lines = []
- def open_verbatim (self, line, level):
- self.__lines.append('\\begin{verbatim}\n')
- if level == 2:
- s = re.sub('veryverbatim[\s,]*', '', line)
- s = re.sub('intertext=\"([^\"]*)\"[\s,]*', '', s)
- s = re.sub(',\s*\]', ']', s)
- s = re.sub('\[\]', '', s)
- self.__lines.append(s);
- def close_verbatim (self):
- self.__lines.append('\\end{verbatim}\n')
- def write (self, s):
- self.__lines.append(s)
- def create_graphics(self):
- s = ''
- g_vec = []
- for line in self.__lines:
- if type(line)==type([]):
- g_vec.append(line)
- for g in g_vec:
- if need_recompile_b(outdir+g[1]+'.ly', outdir+g[1]+'.tex'):
- s = s + ' ' + g[1]+'.ly'
-
- lilyoptions = ''
- for inc in __main__.include_path :
- p = inc[:]
- if p[0] <> os.sep and outdir: # UGH-> win32 ?
- p = '..' + os.sep + p
- lilyoptions = lilyoptions + " -I \"%s\"" % p