4 # TODO: Rewrite this. The control structure is too hairy.
8 # Should use files in /tmp/ only. This potentially messes with
9 # usergenerated files in the CWD
13 =======================================================================
14 LilyPond to dvi converter
16 Features include Title information, paper size specification, and image
19 Usage: ly2dvi.py [OPTION]... [FILE]...
20 Input: LilyPond source or LilyPond generated TeX files
22 =======================================================================
26 version = '@TOPLEVEL_VERSION@'
38 os.environ['LANG'] = '' # Can't grep localized msgs
44 This class handles all ly2dvi.py input file methods
48 __init__() Constructor
49 open(file) Open a .ly file or .tex file using lilyinclude path
50 close() Close current file
51 type() Determine file type .ly (input) or .tex (output)
52 setVars() Set title definitions found in .tex (output) file
67 open file and set private class variable __fd. The search
68 sequence is: current directory followed by the directories
69 found in include property list. Each directory is searched
70 for file, file.ly, file.sly and file.fly.
74 error: ExitNotFound Exception
77 for i in [''] + Props.get('include')[0:]:
78 ifile = os.path.join(i,file)
79 for j in ['','.ly','.fly', '.sly']:
82 this.__fd = open( jfile, 'r' )
86 sys.exit('ExitNotFound', file)
94 close file object __fd
108 Determine input file type. LilyPond source is 'input' type
109 and LilyPond generated TeX file is 'output' type
112 output: 'input' | 'output'
116 firstline = this.__fd.readline()
118 if re.match('%created by: GNU LilyPond [0-9]+[.0-9]+',firstline ):
129 Search for properties in the current input file and set the
130 appropriate values. The supported properties names are in
131 local variable varTable along with the property list
142 ( 'language', Props.setLanguage ),
143 ( 'latexheaders', Props.setHeader ),
144 ( 'orientation', Props.setOrientation ),
145 ( 'paperpapersize', Props.setPaperZize ),
146 ( 'papertextheight', Props.setTextHeight ),
147 ( 'paperlinewidth', Props.setLineWidth ),
148 ( 'filename', Props.setFilename ),
152 for line in this.__fd.readlines():
153 m=re.match('\\\\def\\\\mudela([\w]+){(.*)}',line)
156 if m.group(1) == var[0]:
157 var[1](m.group(2),'file')
159 for var in Props.get('titledefs'):
160 if m.group(1) == var:
161 titles[var]=m.group(2)
163 Props.setTitles(titles,'file')
170 This class handles all ly2dvi.py output file methods
173 __mudelaDefs(opt) Send title info to output file
176 __init__() Constructor
177 write(str) Write a string to output file
178 start(file) Start the latex file
179 next() Process next output file
180 end() Finish latex file and run latex
194 def __mudelaDefs(this,opt):
196 Write titles to output
198 input: opt Supports header and subheader output
203 titles = Props.get('titles')
204 for key in titles.keys():
205 this.write('%s\\mudela%s{%s}%%\n' % (opt,key,titles[key]))
212 Write str to current output file
214 input: str String to write
224 def start(this,file):
226 Start LaTeX file. Calculates the horizontal and vertical
227 margin using pagewidth, pageheight, linewidth, and textheight.
228 Creates temporary output filename and opens it for write.
229 Sends the LaTeX header information to output. Lastly sends
230 the title information to output.
232 input: file output file name
237 now=time.asctime(time.localtime(time.time()))
238 linewidth = Props.get('linewidth')
239 textheight = Props.get('textheight')
241 if Props.get('orientation') == 'landscape':
242 pagewidth = Props.get('pageheight')
243 pageheight = Props.get('pagewidth')
245 pageheight = Props.get('pageheight')
246 pagewidth = Props.get('pagewidth')
248 horizontalMarginArg = ( (pagewidth - linewidth)/2 )
249 verticalMarginArg = ( (pageheight - textheight)/2 )
253 %% Automatically generated from %s, %s
255 \documentclass[%s]{article}
258 \usepackage{geometry}
259 \usepackage[latin1]{inputenc}
260 %%\usepackage[T1]{fontenc}
263 %% don not waste unused space at bottom of page
264 %% (unless we have footnotes ...)
267 %% Maybe this is too drastic, but let us give it a try.
272 %%\addtolength{\oddsidemargin}{-1cm}
273 %%\addtolength{\topmargin}{-1cm}
274 %%\setlength{\textwidth}{%s}
275 %%\setlength{\textheight}{%s}
277 \geometry{width=%spt, left=%spt, height=%spt, top=%spt}
282 \renewcommand{\@oddhead}{\parbox{\textwidth}%%
283 {\mbox{}\small\theheader\hfill\textbf{\thepage}}}%%
285 %%\renewcommand{\@evenhead}{eve!{\small\mudelainstrument{,}\quad\textbf{\thepage}}\hfil}%%
286 \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\thefooter}}%%
288 """ % ( program_id(), Props.get('filename'), now, Props.get('papersize'),
289 Props.get('language'), Props.get('pagenumber'), linewidth, textheight,
290 linewidth, horizontalMarginArg, textheight, verticalMarginArg,
291 Props.get('header') )
293 base, ext = os.path.splitext(file)
295 tempfile.template= base + '_ly'
296 this.__outfile = tempfile.mktemp(ext)
297 base, ext = os.path.splitext(this.__outfile)
298 this.__tmpbase = base
300 this.__fd = open(this.__outfile,"w")
302 sys.exit('ExitNoWrite', this.__outfile)
304 this.__mudelaDefs('')
314 Write LaTeX subheader information to support more than one
315 score in a document. Lastly send current title information to
327 \\def\\mudelapiece{}%
329 this.__mudelaDefs("\\def")
331 \\def\\theopus{\\mudelaopus}% ugh
332 \\def\\thepiece{\\mudelapiece}%
342 Close output file and run latex on it.
346 error: ExitBadLatex Exception
349 outfile=this.__base + '.dvi'
350 if Props.get('output') != '':
351 outfile = os.path.join(Props.get('output'), outfile )
354 %% \vfill\hfill{\mudelatagline}
356 \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\mudelatagline}}%%
361 if os.path.isfile(outfile):
363 if ( os.name == 'posix' ):
364 stat = os.system('latex \'\\nonstopmode \\input %s\'' %
366 else: # Windows shells don't eat the single quotes
367 stat = os.system('latex \\nonstopmode \\input %s' %
370 sys.exit('ExitBadLatex')
371 if not os.path.isfile(outfile):
372 os.rename(this.__tmpbase + '.dvi', outfile)
374 sys.stderr.write('\n' + program_id() + ': dvi file name is %s\n\n'
377 if Props.get('postscript'):
378 psoutfile=this.__base + '.ps'
379 if Props.get('output') != '':
380 psoutfile = os.path.join(Props.get('output'), psoutfile )
381 stat = os.system('dvips -o %s %s' % (psoutfile,outfile))
383 sys.exit('ExitBadPostscript')
389 # ARG! THIS CODE IS BLOATED:
390 # FIXME: Junk all set/get methods.
394 This class handles all ly2dvi.py property manipulation
398 __init__() Constructor
399 set<property> methods
405 # Following is the order of priority for property assignment. The
406 # list is organized from lowest to highest priority. Each
407 # assignment is overridden by the next requester in the list.
409 # Requester Description
410 # --------- -----------
411 # init Initial default values
412 # file The values found in the lilypond generated TeX files
413 # environment Envrionment variables LILYINCLUDE, LILYPONDPREFIX
414 # rcfile $LILYPONDPREFIX/.lilyrc
415 # rcfile $HOME/.lilyrc
417 # commandline command line arguments
419 this.__overrideTable = {
428 this.__roverrideTable = {} # reverse lookup used for debug
429 for i in this.__overrideTable.items():
430 this.__roverrideTable[i[1]]=i[0]
433 'pagewidth' : [597, this.__overrideTable['init']],
434 'pageheight' : [845, this.__overrideTable['init']],
435 'papersize' : ['a4paper', this.__overrideTable['init']],
436 'textheight' : [0, this.__overrideTable['init']],
437 'linewidth' : [500, this.__overrideTable['init']],
438 'orientation' : ['portrait', this.__overrideTable['init']],
439 'language' : ['%', this.__overrideTable['init']],
440 'include' : [[], this.__overrideTable['init']],
441 'debug' : [0, this.__overrideTable['init']],
442 'keeplilypond' : [0, this.__overrideTable['init']],
443 'keeply2dvi' : [0, this.__overrideTable['init']],
444 'pagenumber' : ['%', this.__overrideTable['init']],
445 'separate' : [0, this.__overrideTable['init']],
446 'output' : ['', this.__overrideTable['init']],
447 'header' : ['%', this.__overrideTable['init']],
448 'dependencies' : [0, this.__overrideTable['init']],
449 'root' : ['', this.__overrideTable['init']],
450 'tmp' : ['d:\tmp', this.__overrideTable['init']],
451 'filename' : ['', this.__overrideTable['init']],
452 'titledefs' : [[], this.__overrideTable['init']],
453 'titles' : [{}, this.__overrideTable['init']],
454 'lilyOutputFiles' : [[], this.__overrideTable['init']],
455 'postscript' : [0, this.__overrideTable['init']],
459 # Try to set root and HOME first before calling rcfile
461 if os.environ.has_key('LILYPONDPREFIX'):
462 this.setRoot(os.environ['LILYPONDPREFIX'], 'environment')
464 p=os.path.split(sys.argv[0])
465 p=os.path.split(p[0])
466 # bit silly. for ly2dvi, overrules compiled-in datadir...
467 # how to do this better (without running lily, of course?
468 this.setRoot(os.path.join(p[0],'share','lilypond'), 'init')
470 if not os.environ.has_key('HOME'):
471 if os.environ.has_key('HOMEDRIVE') and \
472 os.environ.has_key('HOMEPATH'):
473 os.environ['HOME'] = os.environ['HOMEDRIVE'] + \
474 os.environ['HOMEPATH']
476 os.environ['HOME'] = os.curdir
478 this.rcfile() # Read initialization file(s)
480 if os.environ.has_key('LILYINCLUDE'):
481 tmp=this.get('include')
482 for s in string.split(os.environ['LILYINCLUDE'],os.pathsep):
484 this.__set('include', tmp, 'environment')
488 if os.environ.has_key ('TEXINPUTS'):
489 t = os.environ['TEXINPUTS'] + os.pathsep
490 os.environ['TEXINPUTS'] = t + \
491 os.path.join(this.get('root'), 'tex' ) + \
492 os.pathsep + os.path.join(this.get('root'), 'ps' )
495 if os.environ.has_key ('MFINPUTS'):
496 t = os.environ['MFINPUTS']
497 os.environ['MFINPUTS'] = t + os.pathsep + \
498 os.path.join(this.get('root'), 'mf')
500 if os.environ.has_key('TMP'):
501 this.__set('tmp',os.environ['TMP'],'environment')
504 def read_titledefs (this):
505 fd=this.get_texfile_path ('titledefs.tex')
508 for line in fd.readlines():
509 m=re.match('\\\\newcommand\*{\\\\mudela([\w]+)}',line)
511 mudefs.append(m.group(1))
513 this.__set('titledefs', mudefs, 'init')
518 def __set(this,var,value,requester):
520 All of the set methods call this to set a property. If the value
521 was last set by a requestor of lesser priority the new value is
522 assigned, else the old value has priority and is unchanged.
525 if this.__overrideTable[requester] < this.__data[var][1]:
528 this.__data[var] = [value, this.__overrideTable[requester]]
535 All of the get methods call this to get a property value. List
536 variable types are return by value to facilitate an append operation.
539 if var == 'include' or var == 'lilyOutputFiles':
540 return this.__data[var][0][0:] # return a copy not a ref
542 return this.__data[var][0]
547 def get_texfile_path (this, var):
549 locate and open titledefs.tex file
553 path = os.path.join(this.get('root'), 'tex', var)
556 cmd =('kpsewhich tex %s %s' % (var,errorlog))
557 pipe = os.popen (cmd, 'r')
558 path = pipe.readline ()[:-1] # chop off \n
559 return_status = pipe.close()
560 if return_status and not path:
561 path = os.path.join(this.get('root'), 'tex', var)
571 Read initialization file(s)
576 ( 'DEBUG', this.setDebug ),
577 ( 'DEPENDENCIES', this.setDependencies ),
578 ( 'KEEPLILYPOND', this.setKeeplilypond ),
579 ( 'KEEPLY2DVI', this.setKeeply2dvi ),
580 ( 'LANGUAGE', this.setLanguage ),
581 ( 'LATEXHF', this.setHeader ),
582 ( 'LILYINCLUDE', this.setInclude ),
583 ( 'LILYPONDPREFIX', this.setRoot ),
584 ( 'NONUMBER', this.setNonumber ),
585 ( 'ORIENTATION', this.setOrientation ),
586 ( 'OUTPUTDIR', this.setOutput ),
587 ( 'PAPERSIZE', this.setPaperZize ),
588 ( 'PHEIGHT', this.setTextHeight ),
589 ( 'POSTSCRIPT', this.setPostscript ),
590 ( 'PWIDTH', this.setLineWidth ),
591 ( 'SEPARATE', this.setSeparate ),
592 ( 'TMP', this.setTmp ),
595 if ( os.name == 'posix' ):
596 dotFilename='.lilyrc'
597 else: # Windows apps like edit choke on .lilyrc
598 dotFilename='_lilyrc'
600 for d in [os.path.join(this.get('root'),'ly'), \
601 os.environ['HOME'], os.curdir ]:
602 file=os.path.join(d,dotFilename)
604 fd = open( file, 'r' )
608 for line in fd.readlines():
609 if re.match('#.*',line):
611 m=re.search('([\w]+)=(.*)',line)
614 if m.group(1) == var[0]:
615 var[1](m.group(2),'rcfile')
622 def setPaperZize(this,size,requester):
624 Set paper size properties
628 # regex width height name
629 # ----- ----- ------ ----
630 ( 'a0.*', 2389, 3381, 'a0paper' ),
631 ( 'a1$|a1p.*', 1690, 2389, 'a1paper' ),
632 ( 'a2.*', 1194, 1690, 'a2paper' ),
633 ( 'a3.*', 845, 1194, 'a3paper' ),
634 ( 'a4.*', 597, 845, 'a4paper' ),
635 ( 'a5.*', 423, 597, 'a5paper' ),
636 ( 'a6.*', 298, 423, 'a6paper' ),
637 ( 'a7.*', 211, 298, 'a7paper' ),
638 ( 'a8.*', 305, 211, 'a8paper' ),
639 ( 'a9.*', 105, 305, 'a9paper' ),
640 ( 'a10.*', 74, 105, 'a10paper' ),
641 ( 'b0.*', 2847, 4023, 'b0paper' ),
642 ( 'b1.*', 2012, 2847, 'b1paper' ),
643 ( 'b2.*', 1423, 2012, 'b2paper' ),
644 ( 'b3.*', 1006, 1423, 'b3paper' ),
645 ( 'b4.*', 712, 1006, 'b4paper' ),
646 ( 'b5.*', 503, 712, 'b5paper' ),
647 ( 'archA$', 650, 867, 'archApaper' ),
648 ( 'archB$', 867, 1301, 'archBpaper' ),
649 ( 'archC$', 1301, 1734, 'archCpaper' ),
650 ( 'archD$', 1734, 2602, 'archDpaper' ),
651 ( 'archE$', 2602, 3469, 'archEpaper' ),
652 ( 'flsa$|flse$', 614, 940, 'flsapaper' ),
653 ( 'halfletter$', 397, 614, 'halfletterpaper' ),
654 ( 'ledger$', 1229, 795, 'ledgerpaper' ),
655 ( 'legal$', 614, 1012, 'legalpaper' ),
656 ( 'letter$', 614, 795, 'letterpaper' ),
657 ( 'note$', 542, 723, 'notepaper' )
661 for paper in paperTable:
662 if re.match(paper[0],size):
664 this.__set('pagewidth',paper[1],requester)
665 this.__set('pageheight',paper[2],requester)
666 this.__set('papersize',paper[3],requester)
670 sys.exit('ExitBadPaper',size)
675 def setTextHeight(this,size,requester):
677 Set textheight property
680 m=re.match('([0-9][.0-9]*)(cm|mm|pt|$)',size)
682 if m.group(2) == 'cm':
683 this.__set('textheight',\
684 float(m.group(1)) * 72.27/2.54, requester )
685 elif m.group(2) == 'mm':
686 this.__set('textheight',\
687 float(m.group(1)) * 72.27/25.4, requester )
688 elif m.group(2) == 'pt':
689 this.__set('textheight', float(m.group(1)), requester )
690 elif m.group(2) == '':
691 this.__set('textheight', float(m.group(1)), requester )
693 sys.exit('ExitBadHeight', m.group(2))
695 sys.exit('ExitBadHeight', size)
700 def setLineWidth(this,size,requester):
702 Set linewidth propery
705 m=re.match('([0-9][.0-9]*)(cm|mm|pt|$)',size)
707 if m.group(2) == 'cm':
708 this.__set('linewidth', \
709 float(m.group(1)) * 72.27/2.54, requester )
710 elif m.group(2) == 'mm':
711 this.__set('linewidth', \
712 float(m.group(1)) * 72.27/25.4, requester )
713 elif m.group(2) == 'pt':
714 this.__set('linewidth', float(m.group(1)), requester )
715 elif m.group(2) == '':
716 this.__set('linewidth', float(m.group(1)), requester )
718 sys.exit('ExitBadWidth', m.group(2))
720 sys.stderr.write ('ly2dvi: warning: ignoring linewidth: ' + size + '\n')
725 def setOrientation(this,orient,requester):
727 Set orientation property
730 if orient == 'landscape' or orient == 'portrait':
731 this.__set('orientation', orient, requester )
733 sys.exit('ExitBadOrient', orient)
738 def setLanguage(this,lang,requester):
740 Set language property
743 this.__set('language', '\\usepackage[%s]{babel}' % (lang), requester )
748 def setInclude(this,inc, requester):
750 Append an include path
753 tmp = this.get('include')
755 this.__set('include', tmp, requester )
760 def setDebug(this,value,requester):
762 Set or Clear debug flag
766 this.__set('debug',1,requester)
768 this.__set('debug',0,requester)
773 def setKeeplilypond(this, value, requester):
775 Set or Clear keeplilypond flag
779 this.__set('keeplilypond',1,requester)
781 this.__set('keeplilypond',0,requester)
786 def setKeeply2dvi(this, value, requester):
788 Set or Clear keeply2dvi flag
792 this.__set('keeply2dvi',1,requester)
794 this.__set('keeply2dvi',0,requester)
799 def setNonumber(this, value, requester):
805 this.__set('pagenumber','\\pagestyle{empty}',requester)
807 this.__set('pagenumber','%',requester)
812 def setSeparate(this, value, requester):
814 Set or Clear separate flag
818 this.__set('separate',1,requester)
820 this.__set('separate',0,requester)
823 # Set output directory name
825 def setOutput(this,out,requester):
826 this.__set('output',out,requester)
829 # Set latex header name
831 def setHeader(this,head, requester):
832 this.__set('header',head,requester)
835 # Set or Clear Dependencies flag to generate makefile dependencies
837 def setDependencies(this, value, requester):
839 Set or Clear dependencies flag
843 this.__set('dependencies',1,requester)
845 this.__set('dependencies',0,requester)
850 def setTmp(this,dir, requester):
851 this.__set('tmp',dir,requester)
854 # Set mudela source file name
856 def setFilename(this,file, requester):
857 this.__set('filename',file,requester)
862 def setTitles(this,titles, requester):
863 this.__set('titles',titles,requester)
868 def addLilyOutputFiles(this,filelist,requester):
870 Add a to the lily output list
873 tmp = this.get('lilyOutputFiles')
875 this.__set('lilyOutputFiles',tmp,requester)
878 # Set/Clear postscript flag
880 def setPostscript(this,value,requester):
886 this.__set('postscript',1,requester)
888 this.__set('postscript',0,requester)
893 def setRoot(this,path, requester):
895 Set lilypond root directory
898 os.environ['LILYPONDPREFIX'] = path
899 if os.name == 'nt' or os.name == 'dos':
900 path = unc2dos(path);
902 this.__set('root',path,requester)
908 def printProps(this):
913 for key in this.__data.keys():
914 print "%s <%s>:<%s>" % (key,this.get(key),
915 this.__roverrideTable[this.__data[key][1]])
925 if len(Props.get('include')) > 0:
926 inc = string.join (map (lambda x: '-I "%s"' % x, Props.get('include')))
929 if Props.get('dependencies'):
936 def writeLilylog(file,contents):
937 if Props.get('keeplilypond'):
938 base, ext = os.path.splitext(file)
939 tempfile.template=base + "_li"
940 file=tempfile.mktemp('.log')
941 output = Props.get('output')
943 file = os.path.join( output, file )
945 fd = open( file, 'w' )
947 sys.exit('ExitNoWrite', file)
951 def getTeXFile(contents):
953 for line in string.split(contents,'\n'):
954 m = re.search('paper output to (.+)\.\.\.', line)
956 texfiles.append(m.group(1))
959 sys.exit('ExitNoTeXName')
965 Convert a path of format //<drive>/this/that/the/other to
966 <drive>:\this\that\the\other
968 m=re.match('^//([A-Za-z])(/.*)$',path)
970 return m.group(1) + ':' + os.path.normpath(m.group(2))
975 return 'ly2dvi (GNU lilypond) ' + version;
980 return os.environ['MAILADDRESS']
982 return '(address unknown)'
986 sys.stderr.write (program_id () + '\n')
988 def print_version ():
989 sys.stdout.write (program_id () + '\n')
993 """Usage: %s [OPTION]... [FILE]...
995 Generate dvi file from mudela or lilypond output
998 -D,--debug increase verbosity
999 -F,--headers= name of additional LaTeX headers file
1000 -H,--Height= set paper height (points) (see manual page)
1001 -I,--include=DIR add DIR to LilyPond\'s search path
1002 -K,--keeplilypond keep lilypond output files
1003 -L,--landscape set landscape orientation
1004 -N,--nonumber switch off page numbering
1005 -O,--orientation= set orientation (obsolete - use -L instead)
1006 -P,--postscript generate postscript file
1007 -W,--Width= set paper width (points) (see manual page)
1008 -M,--dependencies tell lilypond make a dependencies file
1009 -h,--help this help text
1010 -k,--keeply2dvi keep ly2dvi output files
1011 -l,--language= give LaTeX language (babel)
1012 -o,--output= set output directory
1013 -p,--papersize= give LaTeX papersize (eg. a4)
1014 -s,--separate run all files separately through LaTeX
1016 files may be (a mix of) input to or output from lilypond(1)
1026 """Generate dvi files from lilypond source/output"""
1029 outfile = TeXOutput()
1033 (options, files) = getopt.getopt (sys.argv[1:],
1034 'DF:H:I:KLNPW:Mhkl:o:p:s',
1035 ['debug', 'headers=', 'Height=',
1036 'include=', 'keeplilypond', 'landscape',
1037 'nonumber', 'Width=', 'dependencies',
1038 'help', 'keeply2dvi', 'language=',
1039 'output=', 'version', 'papersize=', 'separate',
1044 if o == '--debug' or o == '-D':
1045 Props.setDebug(1,'commandline')
1046 elif o == '--headers' or o == '-F':
1047 Props.setHeader(a,'commandline')
1048 elif o == '--include' or o == '-I':
1049 Props.setInclude(a,'commandline')
1050 elif o == '--Height' or o == '-H':
1051 Props.setTextHeight(a,'commandline')
1052 elif o == '--keeplilypond' or o == '-K':
1053 Props.setKeeplilypond(1,'commandline')
1054 elif o == '--landscape' or o == '-L':
1055 Props.setOrientation('landscape','commandline')
1056 elif o == '--nonumber' or o == '-N':
1057 Props.setNonumber(1,'commandline')
1058 elif o == '--Width' or o == '-W':
1059 Props.setLineWidth(a,'commandline')
1060 elif o == '--dependencies' or o == '-M':
1061 Props.setDependencies(1,'commandline')
1062 elif o == '--help' or o == '-h':
1065 elif o == '--keeply2dvi' or o == '-k':
1066 Props.setKeeply2dvi(1,'commandline')
1067 elif o == '--language' or o == '-l':
1068 Props.setLanguage(a,'commandline')
1069 elif o == '--output' or o == '-o':
1070 Props.setOutput(a,'commandline')
1071 elif o == '--papersize' or o == '-p':
1072 Props.setPaperZize(a,'commandline')
1073 elif o == '--separate' or o == '-s':
1074 Props.setSeparate(1,'commandline')
1075 elif o == '--postscript' or o == '-P':
1076 Props.setPostscript(1,'commandline')
1077 elif o == '--version':
1082 Props.read_titledefs ()
1087 type = infile.type()
1089 if type == 'source':
1090 if os.environ.has_key('OS') and \
1091 os.environ['OS'] == 'Windows_95':
1092 cmd = 'ash -c "lilypond %s %s 2>&1"' %(getLilyopts(), file)
1094 cmd = 'lilypond %s %s 2>&1' % (getLilyopts(), file)
1095 sys.stderr.write ('executing: %s\n'% cmd)
1097 fd = os.popen(cmd , 'r')
1102 sys.stderr.write (s)
1109 sys.stderr.write (s)
1115 sys.exit('ExitBadLily', cmd )
1116 texFiles=getTeXFile(log)
1117 writeLilylog(file,log)
1118 Props.addLilyOutputFiles(texFiles,'program')
1119 texInputFiles = texInputFiles + texFiles
1121 texInputFiles.append(file)
1124 for file in texInputFiles:
1126 infile.setVars() # first pass set variables
1128 if Props.get('debug'):
1131 outfile.start(file) # allow for specified name
1137 if Props.get('separate'):
1141 if not Props.get('separate'):
1145 sys.exit('ExitBadArgs','No files specified')
1151 'ExitInterupt' : ['Ouch!', 1 ],
1152 'ExitBadArgs' : ['Wrong number of arguments', 2 ],
1153 'ExitNotFound' : ['File not found', 3 ],
1154 'ExitBadPaper' : ['Unknown papersize', 4 ],
1155 'ExitBadHeight' : ['Invalid Height specification', 5 ],
1156 'ExitBadWidth' : ['Invalid Width specification', 6 ],
1157 'ExitBadOrient' : ['Invalid Orientation specification', 7 ],
1158 'ExitNoWrite' : ['Permission denied', 8 ],
1159 'ExitNoTeXName' : ['hmm, I could not find an output file name', 9 ],
1160 'ExitBadLily' : ['Lilypond failed', 10 ],
1161 'ExitBadLatex' : ['Latex failed', 11 ],
1162 'ExitBadPostscript' : ['Postscript failed', 12 ],
1163 'ExitUnknown' : ['Unknown Exit Code', 20 ],
1169 if not Props.get('keeplilypond'):
1170 lilyfiles = Props.get('lilyOutputFiles')
1171 if not Props.get('keeply2dvi'):
1172 tmpfiles = glob.glob('*_ly[0-9]*.*')
1173 for file in lilyfiles + tmpfiles:
1174 if os.path.isfile(file):
1178 Props = Properties()
1183 except KeyboardInterrupt:
1184 print ExitTable['ExitInterupt'][0]
1186 sys.exit(ExitTable['ExitInterupt'][1])
1188 except SystemExit, errno:
1189 if ExitTable.has_key(errno.args[0]):
1190 msg = ExitTable[errno.args[0]]
1192 msg = ExitTable['ExitUnknown']
1193 if len(errno.args) > 1:
1194 sys.stderr.write( '%s: %s: %s\n' % (name, msg[0], errno.args[1]))
1196 sys.stderr.write( '%s %s\n' % (name, msg[0]))
1197 if Props.get('debug'):