6 # * Rewrite this. The control structure is too hairy.
8 # * more helpful info on lily crashes
9 # * Should use files in /tmp/ only. This potentially messes with
10 # usergenerated files in the CWD
14 =======================================================================
15 LilyPond to dvi converter
17 Features include Title information, paper size specification, and image
20 Usage: ly2dvi.py [OPTION]... [FILE]...
21 Input: LilyPond source or LilyPond generated TeX files
23 =======================================================================
27 version = '@TOPLEVEL_VERSION@'
39 # Can't grep localized msgs
40 os.environ['LC_ALL'] = ''
41 os.environ['LANG'] = ''
42 os.environ['LC_LANG'] = ''
48 This class handles all ly2dvi.py input file methods
52 __init__() Constructor
53 open(file) Open a .ly file or .tex file using lilyinclude path
54 close() Close current file
55 type() Determine file type .ly (input) or .tex (output)
56 setVars() Set title definitions found in .tex (output) file
71 open file and set private class variable __fd. The search
72 sequence is: current directory followed by the directories
73 found in include property list. Each directory is searched
74 for file, file.ly, file.sly and file.fly.
78 error: ExitNotFound Exception
81 for i in [''] + Props.get('include')[0:]:
82 ifile = os.path.join(i,file)
83 for j in ['','.ly','.fly', '.sly']:
86 this.__fd = open( jfile, 'r' )
90 sys.exit('ExitNotFound', file)
98 close file object __fd
112 Determine input file type. LilyPond source is 'input' type
113 and LilyPond generated TeX file is 'output' type
116 output: 'input' | 'output'
120 firstline = this.__fd.readline()
122 if re.match('%created by: GNU LilyPond [0-9]+[.0-9]+',firstline ):
133 Search for properties in the current input file and set the
134 appropriate values. The supported properties names are in
135 local variable varTable along with the property list
146 ( 'language', Props.setLanguage ),
147 ( 'latexheaders', Props.setHeader ),
148 ( 'paperorientation', Props.setOrientation ),
149 ( 'paperpapersize', Props.setPaperZize ),
150 ( 'papertextheight', Props.setTextHeight ),
151 ( 'paperlinewidth', Props.setLineWidth ),
152 ( 'filename', Props.setFilename ),
156 for line in this.__fd.readlines():
157 m=re.match('\\\\def\\\\lilypond([\w]+){(.*)}',line)
160 if m.group(1) == var[0]:
161 var[1](m.group(2),'file')
163 for var in Props.get('titledefs'):
164 if m.group(1) == var:
165 titles[var]=m.group(2)
167 Props.setTitles(titles,'file')
174 This class handles all ly2dvi.py output file methods
177 __lilypondDefs(opt) Send title info to output file
180 __init__() Constructor
181 write(str) Write a string to output file
182 start(file) Start the latex file
183 next() Process next output file
184 end() Finish latex file and run latex
198 def __lilypondDefs(this,opt):
200 Write titles to output
202 input: opt Supports header and subheader output
207 titles = Props.get('titles')
208 for key in titles.keys():
209 this.write('%s\\lilypond%s{%s}%%\n' % (opt,key,titles[key]))
216 Write str to current output file
218 input: str String to write
228 def start(this,file):
230 Start LaTeX file. Sets the linewidth (and possibly the
231 textheight) and leaves the page layout to the geometry
232 package. Creates temporary output filename and opens it
233 for write. Sends the LaTeX header information to output.
234 Lastly sends the title information to output.
236 input: file output file name
241 now=time.asctime(time.localtime(time.time()))
243 # Only set the textheight if it was explicitly set by the user,
244 # otherwise use the default. Helps to handle landscape correctly!
245 if Props.get('textheight') > 0:
246 textheightsetting = ',textheight=' + `Props.get('textheight')` + 'pt'
248 textheightsetting = ''
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.
268 \geometry{width=%spt%s,headheight=2mm,headsep=0pt,footskip=2mm,%s}
272 \renewcommand{\@oddhead}{\parbox{\textwidth}%%
273 {\mbox{}\small\theheader\hfill\textbf{\thepage}}}%%
275 %%\renewcommand{\@evenhead}{eve!{\small\lilypondinstrument{,}\quad\textbf{\thepage}}\hfil}%%
276 \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\thefooter}}%%
278 """ % ( program_id(), Props.get('filename'), now, Props.get('papersize'),
279 Props.get('language'), Props.get('pagenumber'), Props.get('linewidth'),
280 textheightsetting, Props.get('orientation'), Props.get('header') )
282 base, ext = os.path.splitext(file)
284 tempfile.template= base + '_ly'
285 this.__outfile = tempfile.mktemp(ext)
286 base, ext = os.path.splitext(this.__outfile)
287 this.__tmpbase = base
289 this.__fd = open(this.__outfile,"w")
291 sys.exit('ExitNoWrite', this.__outfile)
293 this.__lilypondDefs('')
303 Write LaTeX subheader information to support more than one
304 score in a document. Lastly send current title information to
315 \\def\\lilypondopus{}%
316 \\def\\lilypondpiece{}%
318 this.__lilypondDefs("\\def")
320 \\def\\theopus{\\lilypondopus}% ugh
321 \\def\\thepiece{\\lilypondpiece}%
331 Close output file and run latex on it.
335 error: ExitBadLatex Exception
338 outfile=this.__base + '.dvi'
339 if Props.get('output') != '':
340 outfile = os.path.join(Props.get('output'), outfile )
343 %% \vfill\hfill{\lilypondtagline}
345 \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\lilypondtagline}}%%
350 if os.path.isfile(outfile):
352 if ( os.name == 'posix' ):
353 stat = os.system('latex \'\\nonstopmode \\input %s\'' %
355 else: # Windows shells don't eat the single quotes
356 stat = os.system('latex \\nonstopmode \\input %s' %
359 sys.exit('ExitBadLatex')
360 if not os.path.isfile(outfile):
361 os.rename(this.__tmpbase + '.dvi', outfile)
363 sys.stderr.write('\n' + program_id() + ': dvi file name is %s\n\n'
366 if Props.get('postscript'):
368 if Props.get('orientation') == 'landscape':
369 dvipsopts=dvipsopts + ' -t landscape'
370 psoutfile=this.__base + '.ps'
371 if Props.get('output') != '':
372 psoutfile = os.path.join(Props.get('output'), psoutfile )
373 stat = os.system('dvips %s -o %s %s' % (dvipsopts,psoutfile,outfile))
375 sys.exit('ExitBadPostscript')
381 # ARG! THIS CODE IS BLOATED:
382 # FIXME: Junk all set/get methods.
386 This class handles all ly2dvi.py property manipulation
390 __init__() Constructor
391 set<property> methods
397 # Following is the order of priority for property assignment. The
398 # list is organized from lowest to highest priority. Each
399 # assignment is overridden by the next requester in the list.
401 # Requester Description
402 # --------- -----------
403 # init Initial default values
404 # file The values found in the LilyPond generated TeX files
405 # environment Envrionment variables LILYINCLUDE, LILYPONDPREFIX
406 # rcfile $LILYPONDPREFIX/.lilyrc
407 # rcfile $HOME/.lilyrc
409 # commandline command line arguments
411 this.__overrideTable = {
420 this.__roverrideTable = {} # reverse lookup used for debug
421 for i in this.__overrideTable.items():
422 this.__roverrideTable[i[1]]=i[0]
425 'papersize' : ['a4paper', this.__overrideTable['init']],
426 'textheight' : [0, this.__overrideTable['init']],
427 'linewidth' : [500, this.__overrideTable['init']],
428 'orientation' : ['portrait', this.__overrideTable['init']],
429 'language' : ['%', this.__overrideTable['init']],
430 'include' : [[], this.__overrideTable['init']],
431 'debug' : [0, this.__overrideTable['init']],
432 'keeplilypond' : [0, this.__overrideTable['init']],
433 'keeply2dvi' : [0, this.__overrideTable['init']],
434 'pagenumber' : ['%', this.__overrideTable['init']],
435 'separate' : [0, this.__overrideTable['init']],
436 'output' : ['', this.__overrideTable['init']],
437 'header' : ['%', this.__overrideTable['init']],
438 'dependencies' : [0, this.__overrideTable['init']],
439 'root' : ['', this.__overrideTable['init']],
440 'tmp' : ['d:\tmp', this.__overrideTable['init']],
441 'filename' : ['', this.__overrideTable['init']],
442 'titledefs' : [[], this.__overrideTable['init']],
443 'titles' : [{}, this.__overrideTable['init']],
444 'lilyOutputFiles' : [[], this.__overrideTable['init']],
445 'postscript' : [0, this.__overrideTable['init']],
449 # Try to set root and HOME first before calling rcfile
451 if os.environ.has_key('LILYPONDPREFIX'):
452 this.setRoot(os.environ['LILYPONDPREFIX'], 'environment')
454 p=os.path.split(sys.argv[0])
455 p=os.path.split(p[0])
456 # bit silly. for ly2dvi, overrules compiled-in datadir...
457 # how to do this better (without running lily, of course?
458 this.setRoot(os.path.join(p[0],'share','lilypond'), 'init')
460 if not os.environ.has_key('HOME'):
461 if os.environ.has_key('HOMEDRIVE') and \
462 os.environ.has_key('HOMEPATH'):
463 os.environ['HOME'] = os.environ['HOMEDRIVE'] + \
464 os.environ['HOMEPATH']
466 os.environ['HOME'] = os.curdir
468 this.rcfile() # Read initialization file(s)
470 if os.environ.has_key('LILYINCLUDE'):
471 tmp=this.get('include')
472 for s in string.split(os.environ['LILYINCLUDE'],os.pathsep):
474 this.__set('include', tmp, 'environment')
478 if os.environ.has_key ('TEXINPUTS'):
479 t = os.environ['TEXINPUTS'] + os.pathsep
480 os.environ['TEXINPUTS'] = t + \
481 os.path.join(this.get('root'), 'tex' ) + \
482 os.pathsep + os.path.join(this.get('root'), 'ps' )
485 if os.environ.has_key ('MFINPUTS'):
486 t = os.environ['MFINPUTS']
487 os.environ['MFINPUTS'] = t + os.pathsep + \
488 os.path.join(this.get('root'), 'mf')
490 if os.environ.has_key('TMP'):
491 this.__set('tmp',os.environ['TMP'],'environment')
494 def read_titledefs (this):
495 fd=this.get_texfile_path ('titledefs.tex')
498 for line in fd.readlines():
499 m=re.match('\\\\newcommand\*{\\\\lilypond([\w]+)}',line)
501 mudefs.append(m.group(1))
503 this.__set('titledefs', mudefs, 'init')
508 def __set(this,var,value,requester):
510 All of the set methods call this to set a property. If the value
511 was last set by a requestor of lesser priority the new value is
512 assigned, else the old value has priority and is unchanged.
515 if this.__overrideTable[requester] < this.__data[var][1]:
518 this.__data[var] = [value, this.__overrideTable[requester]]
525 All of the get methods call this to get a property value. List
526 variable types are return by value to facilitate an append operation.
529 if var == 'include' or var == 'lilyOutputFiles':
530 return this.__data[var][0][0:] # return a copy not a ref
532 return this.__data[var][0]
537 def get_texfile_path (this, var):
539 locate and open titledefs.tex file
543 path = os.path.join(this.get('root'), 'tex', var)
546 cmd =('kpsewhich tex %s %s' % (var,errorlog))
547 pipe = os.popen (cmd, 'r')
548 path = pipe.readline ()[:-1] # chop off \n
549 return_status = pipe.close()
550 if return_status and not path:
551 path = os.path.join(this.get('root'), 'tex', var)
561 Read initialization file(s)
566 ( 'DEBUG', this.setDebug ),
567 ( 'DEPENDENCIES', this.setDependencies ),
568 ( 'KEEPLILYPOND', this.setKeeplilypond ),
569 ( 'KEEPLY2DVI', this.setKeeply2dvi ),
570 ( 'LANGUAGE', this.setLanguage ),
571 ( 'LATEXHF', this.setHeader ),
572 ( 'LILYINCLUDE', this.setInclude ),
573 ( 'LILYPONDPREFIX', this.setRoot ),
574 ( 'NONUMBER', this.setNonumber ),
575 ( 'ORIENTATION', this.setOrientation ),
576 ( 'OUTPUTDIR', this.setOutput ),
577 ( 'PAPERSIZE', this.setPaperZize ),
578 ( 'PHEIGHT', this.setTextHeight ),
579 ( 'POSTSCRIPT', this.setPostscript ),
580 ( 'PWIDTH', this.setLineWidth ),
581 ( 'SEPARATE', this.setSeparate ),
582 ( 'TMP', this.setTmp ),
585 if ( os.name == 'posix' ):
586 dotFilename='.lilyrc'
587 else: # Windows apps like edit choke on .lilyrc
588 dotFilename='_lilyrc'
590 for d in [os.path.join(this.get('root'),'ly'), \
591 os.environ['HOME'], os.curdir ]:
592 file=os.path.join(d,dotFilename)
594 fd = open( file, 'r' )
598 for line in fd.readlines():
599 if re.match('#.*',line):
601 m=re.search('([\w]+)=(.*)',line)
604 if m.group(1) == var[0]:
605 var[1](m.group(2),'rcfile')
612 def setPaperZize(this,size,requester):
614 Set paper size properties
618 # regex width height name
619 # ----- ----- ------ ----
620 ( 'a0.*', 2389, 3381, 'a0paper' ),
621 ( 'a1$|a1p.*', 1690, 2389, 'a1paper' ),
622 ( 'a2.*', 1194, 1690, 'a2paper' ),
623 ( 'a3.*', 845, 1194, 'a3paper' ),
624 ( 'a4.*', 597, 845, 'a4paper' ),
625 ( 'a5.*', 423, 597, 'a5paper' ),
626 ( 'a6.*', 298, 423, 'a6paper' ),
627 ( 'a7.*', 211, 298, 'a7paper' ),
628 ( 'a8.*', 305, 211, 'a8paper' ),
629 ( 'a9.*', 105, 305, 'a9paper' ),
630 ( 'a10.*', 74, 105, 'a10paper' ),
631 ( 'b0.*', 2847, 4023, 'b0paper' ),
632 ( 'b1.*', 2012, 2847, 'b1paper' ),
633 ( 'b2.*', 1423, 2012, 'b2paper' ),
634 ( 'b3.*', 1006, 1423, 'b3paper' ),
635 ( 'b4.*', 712, 1006, 'b4paper' ),
636 ( 'b5.*', 503, 712, 'b5paper' ),
637 ( 'archA$', 650, 867, 'archApaper' ),
638 ( 'archB$', 867, 1301, 'archBpaper' ),
639 ( 'archC$', 1301, 1734, 'archCpaper' ),
640 ( 'archD$', 1734, 2602, 'archDpaper' ),
641 ( 'archE$', 2602, 3469, 'archEpaper' ),
642 ( 'flsa$|flse$', 614, 940, 'flsapaper' ),
643 ( 'halfletter$', 397, 614, 'halfletterpaper' ),
644 ( 'ledger$', 1229, 795, 'ledgerpaper' ),
645 ( 'legal$', 614, 1012, 'legalpaper' ),
646 ( 'letter$', 614, 795, 'letterpaper' ),
647 ( 'note$', 542, 723, 'notepaper' )
651 for paper in paperTable:
652 if re.match(paper[0],size):
654 this.__set('papersize',paper[3],requester)
658 sys.exit('ExitBadPaper',size)
663 def setTextHeight(this,size,requester):
665 Set textheight property
668 m=re.match('([0-9][.0-9]*)(cm|mm|pt|$)',size)
670 if m.group(2) == 'cm':
671 this.__set('textheight',\
672 float(m.group(1)) * 72.27/2.54, requester )
673 elif m.group(2) == 'mm':
674 this.__set('textheight',\
675 float(m.group(1)) * 72.27/25.4, requester )
676 elif m.group(2) == 'pt':
677 this.__set('textheight', float(m.group(1)), requester )
678 elif m.group(2) == '':
679 this.__set('textheight', float(m.group(1)), requester )
681 sys.exit('ExitBadHeight', m.group(2))
683 sys.exit('ExitBadHeight', size)
688 def setLineWidth(this,size,requester):
690 Set linewidth propery
693 m=re.match('([0-9][.0-9]*)(cm|mm|pt|$)',size)
695 if m.group(2) == 'cm':
696 this.__set('linewidth', \
697 float(m.group(1)) * 72.27/2.54, requester )
698 elif m.group(2) == 'mm':
699 this.__set('linewidth', \
700 float(m.group(1)) * 72.27/25.4, requester )
701 elif m.group(2) == 'pt':
702 this.__set('linewidth', float(m.group(1)), requester )
703 elif m.group(2) == '':
704 this.__set('linewidth', float(m.group(1)), requester )
706 sys.exit('ExitBadWidth', m.group(2))
708 sys.stderr.write ('ly2dvi: warning: ignoring linewidth: ' + size + '\n')
713 def setOrientation(this,orient,requester):
715 Set orientation property
718 if orient == 'landscape' or orient == 'portrait':
719 this.__set('orientation', orient, requester )
721 sys.exit('ExitBadOrient', orient)
726 def setLanguage(this,lang,requester):
728 Set language property
731 this.__set('language', '\\usepackage[%s]{babel}' % (lang), requester )
736 def setInclude(this,inc, requester):
738 Append an include path
741 tmp = this.get('include')
743 this.__set('include', tmp, requester )
748 def setDebug(this,value,requester):
750 Set or Clear debug flag
754 this.__set('debug',1,requester)
756 this.__set('debug',0,requester)
761 def setKeeplilypond(this, value, requester):
763 Set or Clear keeplilypond flag
767 this.__set('keeplilypond',1,requester)
769 this.__set('keeplilypond',0,requester)
774 def setKeeply2dvi(this, value, requester):
776 Set or Clear keeply2dvi flag
780 this.__set('keeply2dvi',1,requester)
782 this.__set('keeply2dvi',0,requester)
787 def setNonumber(this, value, requester):
793 this.__set('pagenumber','\\pagestyle{empty}',requester)
795 this.__set('pagenumber','%',requester)
800 def setSeparate(this, value, requester):
802 Set or Clear separate flag
806 this.__set('separate',1,requester)
808 this.__set('separate',0,requester)
811 # Set output directory name
813 def setOutput(this,out,requester):
814 this.__set('output',out,requester)
817 # Set latex header name
819 def setHeader(this,head, requester):
820 this.__set('header','\\input{' + head + '}',requester)
823 # Set or Clear Dependencies flag to generate makefile dependencies
825 def setDependencies(this, value, requester):
827 Set or Clear dependencies flag
831 this.__set('dependencies',1,requester)
833 this.__set('dependencies',0,requester)
838 def setTmp(this,dir, requester):
839 this.__set('tmp',dir,requester)
842 # Set lilypond source file name
844 def setFilename(this,file, requester):
845 this.__set('filename',file,requester)
850 def setTitles(this,titles, requester):
851 this.__set('titles',titles,requester)
856 def addLilyOutputFiles(this,filelist,requester):
858 Add a to the lily output list
861 tmp = this.get('lilyOutputFiles')
863 this.__set('lilyOutputFiles',tmp,requester)
866 # Set/Clear postscript flag
868 def setPostscript(this,value,requester):
874 this.__set('postscript',1,requester)
876 this.__set('postscript',0,requester)
881 def setRoot(this,path, requester):
883 Set LilyPond root directory
886 os.environ['LILYPONDPREFIX'] = path
887 if os.name == 'nt' or os.name == 'dos':
888 path = unc2dos(path);
890 this.__set('root',path,requester)
896 def printProps(this):
901 for key in this.__data.keys():
902 print "%s <%s>:<%s>" % (key,this.get(key),
903 this.__roverrideTable[this.__data[key][1]])
913 if len(Props.get('include')) > 0:
914 inc = string.join (map (lambda x: '-I "%s"' % x, Props.get('include')))
917 if Props.get('dependencies'):
924 def writeLilylog(file,contents):
925 if Props.get('keeplilypond'):
926 base, ext = os.path.splitext(file)
927 tempfile.template=base + "_li"
928 file=tempfile.mktemp('.log')
929 output = Props.get('output')
931 file = os.path.join( output, file )
933 fd = open( file, 'w' )
935 sys.exit('ExitNoWrite', file)
939 def getTeXFile(contents):
941 for line in string.split(contents,'\n'):
942 m = re.search('paper output to (.+)\.\.\.', line)
944 texfiles.append(m.group(1))
947 sys.exit('ExitNoTeXName')
953 Convert a path of format //<drive>/this/that/the/other to
954 <drive>:\this\that\the\other
956 m=re.match('^//([A-Za-z])(/.*)$',path)
958 return m.group(1) + ':' + os.path.normpath(m.group(2))
963 return 'ly2dvi (GNU LilyPond) ' + version;
968 return os.environ['MAILADDRESS']
970 return '(address unknown)'
974 sys.stderr.write (program_id () + '\n')
976 def print_version ():
977 sys.stdout.write (program_id () + '\n')
981 """Usage: %s [OPTION]... [FILE]...
983 Generate dvi file from LilyPond source/output
986 -D,--debug increase verbosity
987 -F,--headers= name of additional LaTeX headers file
988 -H,--Height= set paper height (points) (see manual page)
989 -I,--include=DIR add DIR to LilyPond\'s search path
990 -K,--keeplilypond keep LilyPond output files
991 -L,--landscape set landscape orientation
992 -N,--nonumber switch off page numbering
993 -O,--orientation= set orientation (obsolete -- use -L instead)
994 -P,--postscript generate PostScript file
995 -W,--Width= set paper width (points) (see manual page)
996 -M,--dependencies tell LilyPond to make a dependencies file
997 -h,--help this help text
998 -k,--keeply2dvi keep ly2dvi output files
999 -l,--language= give LaTeX language (babel)
1000 -o,--output= set output directory
1001 -p,--papersize= give LaTeX papersize (eg. a4)
1002 -s,--separate run all files separately through LaTeX
1004 files may be (a mix of) input to or output from LilyPond(1)
1014 """Generate dvi files from LilyPond source/output"""
1017 outfile = TeXOutput()
1021 (options, files) = getopt.getopt (sys.argv[1:],
1022 'DF:H:I:KLNPW:Mhkl:o:p:s',
1023 ['debug', 'headers=', 'Height=',
1024 'include=', 'keeplilypond', 'landscape',
1025 'nonumber', 'Width=', 'dependencies',
1026 'help', 'keeply2dvi', 'language=',
1027 'output=', 'version', 'papersize=', 'separate',
1033 if o == '--debug' or o == '-D':
1034 Props.setDebug(1,'commandline')
1035 elif o == '--headers' or o == '-F':
1036 Props.setHeader(a,'commandline')
1037 elif o == '--include' or o == '-I':
1038 Props.setInclude(a,'commandline')
1039 elif o == '--Height' or o == '-H':
1040 Props.setTextHeight(a,'commandline')
1041 elif o == '--keeplilypond' or o == '-K':
1042 Props.setKeeplilypond(1,'commandline')
1043 elif o == '--landscape' or o == '-L':
1044 Props.setOrientation('landscape','commandline')
1045 elif o == '--nonumber' or o == '-N':
1046 Props.setNonumber(1,'commandline')
1047 elif o == '--Width' or o == '-W':
1048 Props.setLineWidth(a,'commandline')
1049 elif o == '--dependencies' or o == '-M':
1050 Props.setDependencies(1,'commandline')
1051 elif o == '--help' or o == '-h':
1054 elif o == '--keeply2dvi' or o == '-k':
1055 Props.setKeeply2dvi(1,'commandline')
1056 elif o == '--language' or o == '-l':
1057 Props.setLanguage(a,'commandline')
1058 elif o == '--output' or o == '-o':
1059 Props.setOutput(a,'commandline')
1060 elif o == '--papersize' or o == '-p':
1061 Props.setPaperZize(a,'commandline')
1062 elif o == '--separate' or o == '-s':
1063 Props.setSeparate(1,'commandline')
1064 elif o == '--postscript' or o == '-P':
1065 Props.setPostscript(1,'commandline')
1066 elif o == '--version':
1074 Props.read_titledefs ()
1079 type = infile.type()
1081 if type == 'source':
1082 if os.environ.has_key('OS') and \
1083 os.environ['OS'] == 'Windows_95':
1084 cmd = 'ash -c "lilypond %s %s 2>&1"' %(getLilyopts(), file)
1086 cmd = 'lilypond %s %s 2>&1' % (getLilyopts(), file)
1087 sys.stderr.write ('executing: %s\n'% cmd)
1089 fd = os.popen(cmd , 'r')
1094 sys.stderr.write (s)
1101 sys.stderr.write (s)
1107 sys.exit('ExitBadLily', cmd )
1108 texFiles=getTeXFile(log)
1109 writeLilylog(file,log)
1110 Props.addLilyOutputFiles(texFiles,'program')
1111 texInputFiles = texInputFiles + texFiles
1113 texInputFiles.append(file)
1116 for file in texInputFiles:
1118 infile.setVars() # first pass set variables
1120 if Props.get('debug'):
1123 outfile.start(file) # allow for specified name
1129 if Props.get('separate'):
1133 if not Props.get('separate'):
1137 sys.exit('ExitBadArgs','No files specified')
1143 'ExitInterupt' : ['Ouch!', 1 ],
1144 'ExitBadArgs' : ['Wrong number of arguments', 2 ],
1145 'ExitNotFound' : ['File not found', 3 ],
1146 'ExitBadPaper' : ['Unknown papersize', 4 ],
1147 'ExitBadHeight' : ['Invalid Height specification', 5 ],
1148 'ExitBadWidth' : ['Invalid Width specification', 6 ],
1149 'ExitBadOrient' : ['Invalid Orientation specification', 7 ],
1150 'ExitNoWrite' : ['Permission denied', 8 ],
1151 'ExitNoTeXName' : ['Hmm, I could not find an output file name', 9 ],
1152 'ExitBadLily' : ['LilyPond failed', 10 ],
1153 'ExitBadLatex' : ['Latex failed', 11 ],
1154 'ExitBadPostscript' : ['Postscript failed', 12 ],
1155 'ExitUnknown' : ['Unknown Exit Code', 20 ],
1161 if not Props.get('keeplilypond'):
1162 lilyfiles = Props.get('lilyOutputFiles')
1163 if not Props.get('keeply2dvi'):
1164 tmpfiles = glob.glob('*_ly[0-9]*.*')
1165 for file in lilyfiles + tmpfiles:
1166 if os.path.isfile(file):
1170 Props = Properties()
1175 except KeyboardInterrupt:
1176 print ExitTable['ExitInterupt'][0]
1178 sys.exit(ExitTable['ExitInterupt'][1])
1180 except SystemExit, errno:
1181 if ExitTable.has_key(errno.args[0]):
1182 msg = ExitTable[errno.args[0]]
1184 msg = ExitTable['ExitUnknown']
1185 if len(errno.args) > 1:
1186 sys.stderr.write( '%s: %s: %s\n' % (name, msg[0], errno.args[1]))
1188 sys.stderr.write( '%s %s\n' % (name, msg[0]))
1189 if Props.get('debug'):