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')
251 %% Automatically generated from %s, %s
253 \documentclass[%s]{article}
256 \usepackage{geometry}
257 \usepackage[latin1]{inputenc}
258 %%\usepackage[T1]{fontenc}
261 %% don not waste unused space at bottom of page
262 %% (unless we have footnotes ...)
265 %% Maybe this is too drastic, but let us give it a try.
266 \geometry{width=%spt, textheight=%spt,headheight=2mm,headsep=0pt,footskip=2mm}
270 \renewcommand{\@oddhead}{\parbox{\textwidth}%%
271 {\mbox{}\small\theheader\hfill\textbf{\thepage}}}%%
273 %%\renewcommand{\@evenhead}{eve!{\small\mudelainstrument{,}\quad\textbf{\thepage}}\hfil}%%
274 \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\thefooter}}%%
276 """ % ( program_id(), Props.get('filename'), now, Props.get('papersize'),
277 Props.get('language'), Props.get('pagenumber'), linewidth,
278 textheight, Props.get('header') )
280 base, ext = os.path.splitext(file)
282 tempfile.template= base + '_ly'
283 this.__outfile = tempfile.mktemp(ext)
284 base, ext = os.path.splitext(this.__outfile)
285 this.__tmpbase = base
287 this.__fd = open(this.__outfile,"w")
289 sys.exit('ExitNoWrite', this.__outfile)
291 this.__mudelaDefs('')
301 Write LaTeX subheader information to support more than one
302 score in a document. Lastly send current title information to
314 \\def\\mudelapiece{}%
316 this.__mudelaDefs("\\def")
318 \\def\\theopus{\\mudelaopus}% ugh
319 \\def\\thepiece{\\mudelapiece}%
329 Close output file and run latex on it.
333 error: ExitBadLatex Exception
336 outfile=this.__base + '.dvi'
337 if Props.get('output') != '':
338 outfile = os.path.join(Props.get('output'), outfile )
341 %% \vfill\hfill{\mudelatagline}
343 \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\mudelatagline}}%%
348 if os.path.isfile(outfile):
350 if ( os.name == 'posix' ):
351 stat = os.system('latex \'\\nonstopmode \\input %s\'' %
353 else: # Windows shells don't eat the single quotes
354 stat = os.system('latex \\nonstopmode \\input %s' %
357 sys.exit('ExitBadLatex')
358 if not os.path.isfile(outfile):
359 os.rename(this.__tmpbase + '.dvi', outfile)
361 sys.stderr.write('\n' + program_id() + ': dvi file name is %s\n\n'
364 if Props.get('postscript'):
365 psoutfile=this.__base + '.ps'
366 if Props.get('output') != '':
367 psoutfile = os.path.join(Props.get('output'), psoutfile )
368 stat = os.system('dvips -o %s %s' % (psoutfile,outfile))
370 sys.exit('ExitBadPostscript')
376 # ARG! THIS CODE IS BLOATED:
377 # FIXME: Junk all set/get methods.
381 This class handles all ly2dvi.py property manipulation
385 __init__() Constructor
386 set<property> methods
392 # Following is the order of priority for property assignment. The
393 # list is organized from lowest to highest priority. Each
394 # assignment is overridden by the next requester in the list.
396 # Requester Description
397 # --------- -----------
398 # init Initial default values
399 # file The values found in the lilypond generated TeX files
400 # environment Envrionment variables LILYINCLUDE, LILYPONDPREFIX
401 # rcfile $LILYPONDPREFIX/.lilyrc
402 # rcfile $HOME/.lilyrc
404 # commandline command line arguments
406 this.__overrideTable = {
415 this.__roverrideTable = {} # reverse lookup used for debug
416 for i in this.__overrideTable.items():
417 this.__roverrideTable[i[1]]=i[0]
420 'pagewidth' : [597, this.__overrideTable['init']],
421 'pageheight' : [845, this.__overrideTable['init']],
422 'papersize' : ['a4paper', this.__overrideTable['init']],
423 'textheight' : [0, this.__overrideTable['init']],
424 'linewidth' : [500, this.__overrideTable['init']],
425 'orientation' : ['portrait', this.__overrideTable['init']],
426 'language' : ['%', this.__overrideTable['init']],
427 'include' : [[], this.__overrideTable['init']],
428 'debug' : [0, this.__overrideTable['init']],
429 'keeplilypond' : [0, this.__overrideTable['init']],
430 'keeply2dvi' : [0, this.__overrideTable['init']],
431 'pagenumber' : ['%', this.__overrideTable['init']],
432 'separate' : [0, this.__overrideTable['init']],
433 'output' : ['', this.__overrideTable['init']],
434 'header' : ['%', this.__overrideTable['init']],
435 'dependencies' : [0, this.__overrideTable['init']],
436 'root' : ['', this.__overrideTable['init']],
437 'tmp' : ['d:\tmp', this.__overrideTable['init']],
438 'filename' : ['', this.__overrideTable['init']],
439 'titledefs' : [[], this.__overrideTable['init']],
440 'titles' : [{}, this.__overrideTable['init']],
441 'lilyOutputFiles' : [[], this.__overrideTable['init']],
442 'postscript' : [0, this.__overrideTable['init']],
446 # Try to set root and HOME first before calling rcfile
448 if os.environ.has_key('LILYPONDPREFIX'):
449 this.setRoot(os.environ['LILYPONDPREFIX'], 'environment')
451 p=os.path.split(sys.argv[0])
452 p=os.path.split(p[0])
453 # bit silly. for ly2dvi, overrules compiled-in datadir...
454 # how to do this better (without running lily, of course?
455 this.setRoot(os.path.join(p[0],'share','lilypond'), 'init')
457 if not os.environ.has_key('HOME'):
458 if os.environ.has_key('HOMEDRIVE') and \
459 os.environ.has_key('HOMEPATH'):
460 os.environ['HOME'] = os.environ['HOMEDRIVE'] + \
461 os.environ['HOMEPATH']
463 os.environ['HOME'] = os.curdir
465 this.rcfile() # Read initialization file(s)
467 if os.environ.has_key('LILYINCLUDE'):
468 tmp=this.get('include')
469 for s in string.split(os.environ['LILYINCLUDE'],os.pathsep):
471 this.__set('include', tmp, 'environment')
475 if os.environ.has_key ('TEXINPUTS'):
476 t = os.environ['TEXINPUTS'] + os.pathsep
477 os.environ['TEXINPUTS'] = t + \
478 os.path.join(this.get('root'), 'tex' ) + \
479 os.pathsep + os.path.join(this.get('root'), 'ps' )
482 if os.environ.has_key ('MFINPUTS'):
483 t = os.environ['MFINPUTS']
484 os.environ['MFINPUTS'] = t + os.pathsep + \
485 os.path.join(this.get('root'), 'mf')
487 if os.environ.has_key('TMP'):
488 this.__set('tmp',os.environ['TMP'],'environment')
491 def read_titledefs (this):
492 fd=this.get_texfile_path ('titledefs.tex')
495 for line in fd.readlines():
496 m=re.match('\\\\newcommand\*{\\\\mudela([\w]+)}',line)
498 mudefs.append(m.group(1))
500 this.__set('titledefs', mudefs, 'init')
505 def __set(this,var,value,requester):
507 All of the set methods call this to set a property. If the value
508 was last set by a requestor of lesser priority the new value is
509 assigned, else the old value has priority and is unchanged.
512 if this.__overrideTable[requester] < this.__data[var][1]:
515 this.__data[var] = [value, this.__overrideTable[requester]]
522 All of the get methods call this to get a property value. List
523 variable types are return by value to facilitate an append operation.
526 if var == 'include' or var == 'lilyOutputFiles':
527 return this.__data[var][0][0:] # return a copy not a ref
529 return this.__data[var][0]
534 def get_texfile_path (this, var):
536 locate and open titledefs.tex file
540 path = os.path.join(this.get('root'), 'tex', var)
543 cmd =('kpsewhich tex %s %s' % (var,errorlog))
544 pipe = os.popen (cmd, 'r')
545 path = pipe.readline ()[:-1] # chop off \n
546 return_status = pipe.close()
547 if return_status and not path:
548 path = os.path.join(this.get('root'), 'tex', var)
558 Read initialization file(s)
563 ( 'DEBUG', this.setDebug ),
564 ( 'DEPENDENCIES', this.setDependencies ),
565 ( 'KEEPLILYPOND', this.setKeeplilypond ),
566 ( 'KEEPLY2DVI', this.setKeeply2dvi ),
567 ( 'LANGUAGE', this.setLanguage ),
568 ( 'LATEXHF', this.setHeader ),
569 ( 'LILYINCLUDE', this.setInclude ),
570 ( 'LILYPONDPREFIX', this.setRoot ),
571 ( 'NONUMBER', this.setNonumber ),
572 ( 'ORIENTATION', this.setOrientation ),
573 ( 'OUTPUTDIR', this.setOutput ),
574 ( 'PAPERSIZE', this.setPaperZize ),
575 ( 'PHEIGHT', this.setTextHeight ),
576 ( 'POSTSCRIPT', this.setPostscript ),
577 ( 'PWIDTH', this.setLineWidth ),
578 ( 'SEPARATE', this.setSeparate ),
579 ( 'TMP', this.setTmp ),
582 if ( os.name == 'posix' ):
583 dotFilename='.lilyrc'
584 else: # Windows apps like edit choke on .lilyrc
585 dotFilename='_lilyrc'
587 for d in [os.path.join(this.get('root'),'ly'), \
588 os.environ['HOME'], os.curdir ]:
589 file=os.path.join(d,dotFilename)
591 fd = open( file, 'r' )
595 for line in fd.readlines():
596 if re.match('#.*',line):
598 m=re.search('([\w]+)=(.*)',line)
601 if m.group(1) == var[0]:
602 var[1](m.group(2),'rcfile')
609 def setPaperZize(this,size,requester):
611 Set paper size properties
615 # regex width height name
616 # ----- ----- ------ ----
617 ( 'a0.*', 2389, 3381, 'a0paper' ),
618 ( 'a1$|a1p.*', 1690, 2389, 'a1paper' ),
619 ( 'a2.*', 1194, 1690, 'a2paper' ),
620 ( 'a3.*', 845, 1194, 'a3paper' ),
621 ( 'a4.*', 597, 845, 'a4paper' ),
622 ( 'a5.*', 423, 597, 'a5paper' ),
623 ( 'a6.*', 298, 423, 'a6paper' ),
624 ( 'a7.*', 211, 298, 'a7paper' ),
625 ( 'a8.*', 305, 211, 'a8paper' ),
626 ( 'a9.*', 105, 305, 'a9paper' ),
627 ( 'a10.*', 74, 105, 'a10paper' ),
628 ( 'b0.*', 2847, 4023, 'b0paper' ),
629 ( 'b1.*', 2012, 2847, 'b1paper' ),
630 ( 'b2.*', 1423, 2012, 'b2paper' ),
631 ( 'b3.*', 1006, 1423, 'b3paper' ),
632 ( 'b4.*', 712, 1006, 'b4paper' ),
633 ( 'b5.*', 503, 712, 'b5paper' ),
634 ( 'archA$', 650, 867, 'archApaper' ),
635 ( 'archB$', 867, 1301, 'archBpaper' ),
636 ( 'archC$', 1301, 1734, 'archCpaper' ),
637 ( 'archD$', 1734, 2602, 'archDpaper' ),
638 ( 'archE$', 2602, 3469, 'archEpaper' ),
639 ( 'flsa$|flse$', 614, 940, 'flsapaper' ),
640 ( 'halfletter$', 397, 614, 'halfletterpaper' ),
641 ( 'ledger$', 1229, 795, 'ledgerpaper' ),
642 ( 'legal$', 614, 1012, 'legalpaper' ),
643 ( 'letter$', 614, 795, 'letterpaper' ),
644 ( 'note$', 542, 723, 'notepaper' )
648 for paper in paperTable:
649 if re.match(paper[0],size):
651 this.__set('pagewidth',paper[1],requester)
652 this.__set('pageheight',paper[2],requester)
653 this.__set('papersize',paper[3],requester)
657 sys.exit('ExitBadPaper',size)
662 def setTextHeight(this,size,requester):
664 Set textheight property
667 m=re.match('([0-9][.0-9]*)(cm|mm|pt|$)',size)
669 if m.group(2) == 'cm':
670 this.__set('textheight',\
671 float(m.group(1)) * 72.27/2.54, requester )
672 elif m.group(2) == 'mm':
673 this.__set('textheight',\
674 float(m.group(1)) * 72.27/25.4, requester )
675 elif m.group(2) == 'pt':
676 this.__set('textheight', float(m.group(1)), requester )
677 elif m.group(2) == '':
678 this.__set('textheight', float(m.group(1)), requester )
680 sys.exit('ExitBadHeight', m.group(2))
682 sys.exit('ExitBadHeight', size)
687 def setLineWidth(this,size,requester):
689 Set linewidth propery
692 m=re.match('([0-9][.0-9]*)(cm|mm|pt|$)',size)
694 if m.group(2) == 'cm':
695 this.__set('linewidth', \
696 float(m.group(1)) * 72.27/2.54, requester )
697 elif m.group(2) == 'mm':
698 this.__set('linewidth', \
699 float(m.group(1)) * 72.27/25.4, requester )
700 elif m.group(2) == 'pt':
701 this.__set('linewidth', float(m.group(1)), requester )
702 elif m.group(2) == '':
703 this.__set('linewidth', float(m.group(1)), requester )
705 sys.exit('ExitBadWidth', m.group(2))
707 sys.stderr.write ('ly2dvi: warning: ignoring linewidth: ' + size + '\n')
712 def setOrientation(this,orient,requester):
714 Set orientation property
717 if orient == 'landscape' or orient == 'portrait':
718 this.__set('orientation', orient, requester )
720 sys.exit('ExitBadOrient', orient)
725 def setLanguage(this,lang,requester):
727 Set language property
730 this.__set('language', '\\usepackage[%s]{babel}' % (lang), requester )
735 def setInclude(this,inc, requester):
737 Append an include path
740 tmp = this.get('include')
742 this.__set('include', tmp, requester )
747 def setDebug(this,value,requester):
749 Set or Clear debug flag
753 this.__set('debug',1,requester)
755 this.__set('debug',0,requester)
760 def setKeeplilypond(this, value, requester):
762 Set or Clear keeplilypond flag
766 this.__set('keeplilypond',1,requester)
768 this.__set('keeplilypond',0,requester)
773 def setKeeply2dvi(this, value, requester):
775 Set or Clear keeply2dvi flag
779 this.__set('keeply2dvi',1,requester)
781 this.__set('keeply2dvi',0,requester)
786 def setNonumber(this, value, requester):
792 this.__set('pagenumber','\\pagestyle{empty}',requester)
794 this.__set('pagenumber','%',requester)
799 def setSeparate(this, value, requester):
801 Set or Clear separate flag
805 this.__set('separate',1,requester)
807 this.__set('separate',0,requester)
810 # Set output directory name
812 def setOutput(this,out,requester):
813 this.__set('output',out,requester)
816 # Set latex header name
818 def setHeader(this,head, requester):
819 this.__set('header','\\input{' + head + '}',requester)
822 # Set or Clear Dependencies flag to generate makefile dependencies
824 def setDependencies(this, value, requester):
826 Set or Clear dependencies flag
830 this.__set('dependencies',1,requester)
832 this.__set('dependencies',0,requester)
837 def setTmp(this,dir, requester):
838 this.__set('tmp',dir,requester)
841 # Set mudela source file name
843 def setFilename(this,file, requester):
844 this.__set('filename',file,requester)
849 def setTitles(this,titles, requester):
850 this.__set('titles',titles,requester)
855 def addLilyOutputFiles(this,filelist,requester):
857 Add a to the lily output list
860 tmp = this.get('lilyOutputFiles')
862 this.__set('lilyOutputFiles',tmp,requester)
865 # Set/Clear postscript flag
867 def setPostscript(this,value,requester):
873 this.__set('postscript',1,requester)
875 this.__set('postscript',0,requester)
880 def setRoot(this,path, requester):
882 Set lilypond root directory
885 os.environ['LILYPONDPREFIX'] = path
886 if os.name == 'nt' or os.name == 'dos':
887 path = unc2dos(path);
889 this.__set('root',path,requester)
895 def printProps(this):
900 for key in this.__data.keys():
901 print "%s <%s>:<%s>" % (key,this.get(key),
902 this.__roverrideTable[this.__data[key][1]])
912 if len(Props.get('include')) > 0:
913 inc = string.join (map (lambda x: '-I "%s"' % x, Props.get('include')))
916 if Props.get('dependencies'):
923 def writeLilylog(file,contents):
924 if Props.get('keeplilypond'):
925 base, ext = os.path.splitext(file)
926 tempfile.template=base + "_li"
927 file=tempfile.mktemp('.log')
928 output = Props.get('output')
930 file = os.path.join( output, file )
932 fd = open( file, 'w' )
934 sys.exit('ExitNoWrite', file)
938 def getTeXFile(contents):
940 for line in string.split(contents,'\n'):
941 m = re.search('paper output to (.+)\.\.\.', line)
943 texfiles.append(m.group(1))
946 sys.exit('ExitNoTeXName')
952 Convert a path of format //<drive>/this/that/the/other to
953 <drive>:\this\that\the\other
955 m=re.match('^//([A-Za-z])(/.*)$',path)
957 return m.group(1) + ':' + os.path.normpath(m.group(2))
962 return 'ly2dvi (GNU lilypond) ' + version;
967 return os.environ['MAILADDRESS']
969 return '(address unknown)'
973 sys.stderr.write (program_id () + '\n')
975 def print_version ():
976 sys.stdout.write (program_id () + '\n')
980 """Usage: %s [OPTION]... [FILE]...
982 Generate dvi file from mudela or lilypond output
985 -D,--debug increase verbosity
986 -F,--headers= name of additional LaTeX headers file
987 -H,--Height= set paper height (points) (see manual page)
988 -I,--include=DIR add DIR to LilyPond\'s search path
989 -K,--keeplilypond keep lilypond output files
990 -L,--landscape set landscape orientation
991 -N,--nonumber switch off page numbering
992 -O,--orientation= set orientation (obsolete - use -L instead)
993 -P,--postscript generate postscript file
994 -W,--Width= set paper width (points) (see manual page)
995 -M,--dependencies tell lilypond make a dependencies file
996 -h,--help this help text
997 -k,--keeply2dvi keep ly2dvi output files
998 -l,--language= give LaTeX language (babel)
999 -o,--output= set output directory
1000 -p,--papersize= give LaTeX papersize (eg. a4)
1001 -s,--separate run all files separately through LaTeX
1003 files may be (a mix of) input to or output from lilypond(1)
1013 """Generate dvi files from lilypond source/output"""
1016 outfile = TeXOutput()
1020 (options, files) = getopt.getopt (sys.argv[1:],
1021 'DF:H:I:KLNPW:Mhkl:o:p:s',
1022 ['debug', 'headers=', 'Height=',
1023 'include=', 'keeplilypond', 'landscape',
1024 'nonumber', 'Width=', 'dependencies',
1025 'help', 'keeply2dvi', 'language=',
1026 'output=', 'version', 'papersize=', 'separate',
1031 if o == '--debug' or o == '-D':
1032 Props.setDebug(1,'commandline')
1033 elif o == '--headers' or o == '-F':
1034 Props.setHeader(a,'commandline')
1035 elif o == '--include' or o == '-I':
1036 Props.setInclude(a,'commandline')
1037 elif o == '--Height' or o == '-H':
1038 Props.setTextHeight(a,'commandline')
1039 elif o == '--keeplilypond' or o == '-K':
1040 Props.setKeeplilypond(1,'commandline')
1041 elif o == '--landscape' or o == '-L':
1042 Props.setOrientation('landscape','commandline')
1043 elif o == '--nonumber' or o == '-N':
1044 Props.setNonumber(1,'commandline')
1045 elif o == '--Width' or o == '-W':
1046 Props.setLineWidth(a,'commandline')
1047 elif o == '--dependencies' or o == '-M':
1048 Props.setDependencies(1,'commandline')
1049 elif o == '--help' or o == '-h':
1052 elif o == '--keeply2dvi' or o == '-k':
1053 Props.setKeeply2dvi(1,'commandline')
1054 elif o == '--language' or o == '-l':
1055 Props.setLanguage(a,'commandline')
1056 elif o == '--output' or o == '-o':
1057 Props.setOutput(a,'commandline')
1058 elif o == '--papersize' or o == '-p':
1059 Props.setPaperZize(a,'commandline')
1060 elif o == '--separate' or o == '-s':
1061 Props.setSeparate(1,'commandline')
1062 elif o == '--postscript' or o == '-P':
1063 Props.setPostscript(1,'commandline')
1064 elif o == '--version':
1069 Props.read_titledefs ()
1074 type = infile.type()
1076 if type == 'source':
1077 if os.environ.has_key('OS') and \
1078 os.environ['OS'] == 'Windows_95':
1079 cmd = 'ash -c "lilypond %s %s 2>&1"' %(getLilyopts(), file)
1081 cmd = 'lilypond %s %s 2>&1' % (getLilyopts(), file)
1082 sys.stderr.write ('executing: %s\n'% cmd)
1084 fd = os.popen(cmd , 'r')
1089 sys.stderr.write (s)
1096 sys.stderr.write (s)
1102 sys.exit('ExitBadLily', cmd )
1103 texFiles=getTeXFile(log)
1104 writeLilylog(file,log)
1105 Props.addLilyOutputFiles(texFiles,'program')
1106 texInputFiles = texInputFiles + texFiles
1108 texInputFiles.append(file)
1111 for file in texInputFiles:
1113 infile.setVars() # first pass set variables
1115 if Props.get('debug'):
1118 outfile.start(file) # allow for specified name
1124 if Props.get('separate'):
1128 if not Props.get('separate'):
1132 sys.exit('ExitBadArgs','No files specified')
1138 'ExitInterupt' : ['Ouch!', 1 ],
1139 'ExitBadArgs' : ['Wrong number of arguments', 2 ],
1140 'ExitNotFound' : ['File not found', 3 ],
1141 'ExitBadPaper' : ['Unknown papersize', 4 ],
1142 'ExitBadHeight' : ['Invalid Height specification', 5 ],
1143 'ExitBadWidth' : ['Invalid Width specification', 6 ],
1144 'ExitBadOrient' : ['Invalid Orientation specification', 7 ],
1145 'ExitNoWrite' : ['Permission denied', 8 ],
1146 'ExitNoTeXName' : ['hmm, I could not find an output file name', 9 ],
1147 'ExitBadLily' : ['Lilypond failed', 10 ],
1148 'ExitBadLatex' : ['Latex failed', 11 ],
1149 'ExitBadPostscript' : ['Postscript failed', 12 ],
1150 'ExitUnknown' : ['Unknown Exit Code', 20 ],
1156 if not Props.get('keeplilypond'):
1157 lilyfiles = Props.get('lilyOutputFiles')
1158 if not Props.get('keeply2dvi'):
1159 tmpfiles = glob.glob('*_ly[0-9]*.*')
1160 for file in lilyfiles + tmpfiles:
1161 if os.path.isfile(file):
1165 Props = Properties()
1170 except KeyboardInterrupt:
1171 print ExitTable['ExitInterupt'][0]
1173 sys.exit(ExitTable['ExitInterupt'][1])
1175 except SystemExit, errno:
1176 if ExitTable.has_key(errno.args[0]):
1177 msg = ExitTable[errno.args[0]]
1179 msg = ExitTable['ExitUnknown']
1180 if len(errno.args) > 1:
1181 sys.stderr.write( '%s: %s: %s\n' % (name, msg[0], errno.args[1]))
1183 sys.stderr.write( '%s %s\n' % (name, msg[0]))
1184 if Props.get('debug'):