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@'
28 if version == '@' + 'TOPLEVEL_VERSION' + '@':
29 version = '(unknown version)' # uGUHGUHGHGUGH
41 # Can't grep localized msgs
42 os.environ['LC_ALL'] = ''
43 os.environ['LANG'] = ''
44 os.environ['LC_LANG'] = ''
50 This class handles all ly2dvi.py input file methods
54 __init__() Constructor
55 open(file) Open a .ly file or .tex file using lilyinclude path
56 close() Close current file
57 type() Determine file type .ly (input) or .tex (output)
58 setVars() Set title definitions found in .tex (output) file
73 open file and set private class variable __fd. The search
74 sequence is: current directory followed by the directories
75 found in include property list. Each directory is searched
76 for file, file.ly, file.sly and file.fly.
80 error: ExitNotFound Exception
83 for i in [''] + Props.get('include')[0:]:
84 ifile = os.path.join(i,file)
85 for j in ['','.ly','.fly', '.sly']:
88 this.__fd = open( jfile, 'r' )
92 sys.exit('ExitNotFound', file)
100 close file object __fd
114 Determine input file type. LilyPond source is 'input' type
115 and LilyPond generated TeX file is 'output' type
118 output: 'input' | 'output'
122 firstline = this.__fd.readline()
124 if re.match('%created by: GNU LilyPond [0-9]+[.0-9]+',firstline ):
135 Search for properties in the current input file and set the
136 appropriate values. The supported properties names are in
137 local variable varTable along with the property list
148 ( 'language', Props.setLanguage ),
149 ( 'latexheaders', Props.setHeader ),
150 ( 'paperorientation', Props.setOrientation ),
151 ( 'paperpapersize', Props.setPaperZize ),
152 ( 'papertextheight', Props.setTextHeight ),
153 ( 'paperlinewidth', Props.setLineWidth ),
154 ( 'filename', Props.setFilename ),
158 for line in this.__fd.readlines():
159 m=re.match('\\\\def\\\\lilypond([\w]+){(.*)}',line)
162 if m.group(1) == var[0]:
163 var[1](m.group(2),'file')
165 for var in Props.get('titledefs'):
166 if m.group(1) == var:
167 titles[var]=m.group(2)
169 Props.setTitles(titles,'file')
176 This class handles all ly2dvi.py output file methods
179 __lilypondDefs(opt) Send title info to output file
182 __init__() Constructor
183 write(str) Write a string to output file
184 start(file) Start the latex file
185 next() Process next output file
186 end() Finish latex file and run latex
200 def __lilypondDefs(this,opt):
202 Write titles to output
204 input: opt Supports header and subheader output
209 titles = Props.get('titles')
210 for key in titles.keys():
211 this.write('%s\\lilypond%s{%s}%%\n' % (opt,key,titles[key]))
218 Write str to current output file
220 input: str String to write
230 def start(this,file):
232 Start LaTeX file. Sets the linewidth (and possibly the
233 textheight) and leaves the page layout to the geometry
234 package. Creates temporary output filename and opens it
235 for write. Sends the LaTeX header information to output.
236 Lastly sends the title information to output.
238 input: file output file name
243 now=time.asctime(time.localtime(time.time()))
245 # Only set the textheight if it was explicitly set by the user,
246 # otherwise use the default. Helps to handle landscape correctly!
247 if Props.get('textheight') > 0:
248 textheightsetting = ',textheight=' + `Props.get('textheight')` + 'pt'
250 textheightsetting = ''
255 %% Automatically generated from %s, %s
257 \documentclass[%s]{article}
260 \usepackage{geometry}
261 \usepackage[latin1]{inputenc}
262 %%\usepackage[T1]{fontenc}
265 %% don not waste unused space at bottom of page
266 %% (unless we have footnotes ...)
269 %% Maybe this is too drastic, but let us give it a try.
270 \geometry{width=%spt%s,headheight=2mm,headsep=0pt,footskip=2mm,%s}
274 \renewcommand{\@oddhead}{\parbox{\textwidth}%%
275 {\mbox{}\small\theheader\hfill\textbf{\thepage}}}%%
277 %%\renewcommand{\@evenhead}{eve!{\small\lilypondinstrument{,}\quad\textbf{\thepage}}\hfil}%%
278 \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\thefooter}}%%
280 """ % ( program_id(), Props.get('filename'), now, Props.get('papersize'),
281 Props.get('language'), Props.get('pagenumber'), Props.get('linewidth'),
282 textheightsetting, Props.get('orientation'), Props.get('header') )
284 base, ext = os.path.splitext(file)
286 tempfile.template= base + '_ly'
287 this.__outfile = tempfile.mktemp(ext)
288 base, ext = os.path.splitext(this.__outfile)
289 this.__tmpbase = base
291 this.__fd = open(this.__outfile,"w")
293 sys.exit('ExitNoWrite', this.__outfile)
295 this.__lilypondDefs('')
305 Write LaTeX subheader information to support more than one
306 score in a document. Lastly send current title information to
317 \\def\\lilypondopus{}%
318 \\def\\lilypondpiece{}%
320 this.__lilypondDefs("\\def")
322 \\def\\theopus{\\lilypondopus}% ugh
323 \\def\\thepiece{\\lilypondpiece}%
333 Close output file and run latex on it.
337 error: ExitBadLatex Exception
340 outfile=this.__base + '.dvi'
341 if Props.get('output') != '':
342 if not os.path.exists(Props.get('output')):
343 os.mkdir(Props.get('output'))
345 outfile = os.path.join(Props.get('output'), outfile )
348 %% \vfill\hfill{\lilypondtagline}
350 \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\lilypondtagline}}%%
355 if os.path.isfile(outfile):
357 if ( os.name == 'posix' ):
358 stat = os.system('latex \'\\nonstopmode \\input %s\'' %
360 else: # Windows shells don't eat the single quotes
361 stat = os.system('latex \\nonstopmode \\input %s' %
364 sys.exit('ExitBadLatex')
365 if not os.path.isfile(outfile):
366 os.rename(this.__tmpbase + '.dvi', outfile)
368 sys.stderr.write('\n' + program_id() + ': dvi file name is %s\n\n'
371 if Props.get('postscript'):
373 if Props.get('orientation') == 'landscape':
374 dvipsopts=dvipsopts + ' -t landscape'
375 psoutfile=this.__base + '.ps'
376 if Props.get('output') != '':
377 psoutfile = os.path.join(Props.get('output'), psoutfile )
378 stat = os.system('dvips %s -o %s %s' % (dvipsopts,psoutfile,outfile))
380 sys.exit('ExitBadPostscript')
386 # ARG! THIS CODE IS BLOATED:
387 # FIXME: Junk all set/get methods.
391 This class handles all ly2dvi.py property manipulation
395 __init__() Constructor
396 set<property> methods
402 # Following is the order of priority for property assignment. The
403 # list is organized from lowest to highest priority. Each
404 # assignment is overridden by the next requester in the list.
406 # Requester Description
407 # --------- -----------
408 # init Initial default values
409 # file The values found in the LilyPond generated TeX files
410 # environment Envrionment variables LILYINCLUDE, LILYPONDPREFIX
411 # rcfile $LILYPONDPREFIX/.lilyrc
412 # rcfile $HOME/.lilyrc
414 # commandline command line arguments
416 this.__overrideTable = {
425 this.__roverrideTable = {} # reverse lookup used for debug
426 for i in this.__overrideTable.items():
427 this.__roverrideTable[i[1]]=i[0]
430 'papersize' : ['a4paper', this.__overrideTable['init']],
431 'textheight' : [0, this.__overrideTable['init']],
432 'linewidth' : [500, this.__overrideTable['init']],
433 'orientation' : ['portrait', this.__overrideTable['init']],
434 'language' : ['%', this.__overrideTable['init']],
435 'include' : [[], this.__overrideTable['init']],
436 'debug' : [0, this.__overrideTable['init']],
437 'keeplilypond' : [0, this.__overrideTable['init']],
438 'keeply2dvi' : [0, this.__overrideTable['init']],
439 'pagenumber' : ['%', this.__overrideTable['init']],
440 'separate' : [0, this.__overrideTable['init']],
441 'output' : ['', this.__overrideTable['init']],
442 'header' : ['%', this.__overrideTable['init']],
443 'dependencies' : [0, this.__overrideTable['init']],
444 'root' : ['', this.__overrideTable['init']],
445 'tmp' : ['d:\tmp', this.__overrideTable['init']],
446 'filename' : ['', this.__overrideTable['init']],
447 'titledefs' : [[], this.__overrideTable['init']],
448 'titles' : [{}, this.__overrideTable['init']],
449 'lilyOutputFiles' : [[], this.__overrideTable['init']],
450 'postscript' : [0, this.__overrideTable['init']],
454 # Try to set root and HOME first before calling rcfile
456 if os.environ.has_key('LILYPONDPREFIX'):
457 this.setRoot(os.environ['LILYPONDPREFIX'], 'environment')
459 p=os.path.split(sys.argv[0])
460 p=os.path.split(p[0])
461 # bit silly. for ly2dvi, overrules compiled-in datadir...
462 # how to do this better (without running lily, of course?
463 this.setRoot(os.path.join(p[0],'share','lilypond'), 'init')
465 if not os.environ.has_key('HOME'):
466 if os.environ.has_key('HOMEDRIVE') and \
467 os.environ.has_key('HOMEPATH'):
468 os.environ['HOME'] = os.environ['HOMEDRIVE'] + \
469 os.environ['HOMEPATH']
471 os.environ['HOME'] = os.curdir
473 this.rcfile() # Read initialization file(s)
475 if os.environ.has_key('LILYINCLUDE'):
476 tmp=this.get('include')
477 for s in string.split(os.environ['LILYINCLUDE'],os.pathsep):
479 this.__set('include', tmp, 'environment')
483 if os.environ.has_key ('TEXINPUTS'):
484 t = os.environ['TEXINPUTS'] + os.pathsep
485 os.environ['TEXINPUTS'] = t + \
486 os.path.join(this.get('root'), 'tex' ) + \
487 os.pathsep + os.path.join(this.get('root'), 'ps' )
490 if os.environ.has_key ('MFINPUTS'):
491 t = os.environ['MFINPUTS']
492 os.environ['MFINPUTS'] = t + os.pathsep + \
493 os.path.join(this.get('root'), 'mf')
495 if os.environ.has_key('TMP'):
496 this.__set('tmp',os.environ['TMP'],'environment')
499 def read_titledefs (this):
500 fd=this.get_texfile_path ('titledefs.tex')
503 for line in fd.readlines():
504 m=re.match('\\\\newcommand\*{\\\\lilypond([\w]+)}',line)
506 mudefs.append(m.group(1))
508 this.__set('titledefs', mudefs, 'init')
513 def __set(this,var,value,requester):
515 All of the set methods call this to set a property. If the value
516 was last set by a requestor of lesser priority the new value is
517 assigned, else the old value has priority and is unchanged.
520 if this.__overrideTable[requester] < this.__data[var][1]:
523 this.__data[var] = [value, this.__overrideTable[requester]]
530 All of the get methods call this to get a property value. List
531 variable types are return by value to facilitate an append operation.
534 if var == 'include' or var == 'lilyOutputFiles':
535 return this.__data[var][0][0:] # return a copy not a ref
537 return this.__data[var][0]
542 def get_texfile_path (this, var):
544 locate and open titledefs.tex file
548 path = os.path.join(this.get('root'), 'tex', var)
551 cmd =('kpsewhich tex %s %s' % (var,errorlog))
552 pipe = os.popen (cmd, 'r')
553 path = pipe.readline ()[:-1] # chop off \n
554 return_status = pipe.close()
555 if return_status and not path:
556 path = os.path.join(this.get('root'), 'tex', var)
566 Read initialization file(s)
571 ( 'DEBUG', this.setDebug ),
572 ( 'DEPENDENCIES', this.setDependencies ),
573 ( 'KEEPLILYPOND', this.setKeeplilypond ),
574 ( 'KEEPLY2DVI', this.setKeeply2dvi ),
575 ( 'LANGUAGE', this.setLanguage ),
576 ( 'LATEXHF', this.setHeader ),
577 ( 'LILYINCLUDE', this.setInclude ),
578 ( 'LILYPONDPREFIX', this.setRoot ),
579 ( 'NONUMBER', this.setNonumber ),
580 ( 'ORIENTATION', this.setOrientation ),
581 ( 'OUTPUTDIR', this.setOutput ),
582 ( 'PAPERSIZE', this.setPaperZize ),
583 ( 'PHEIGHT', this.setTextHeight ),
584 ( 'POSTSCRIPT', this.setPostscript ),
585 ( 'PWIDTH', this.setLineWidth ),
586 ( 'SEPARATE', this.setSeparate ),
587 ( 'TMP', this.setTmp ),
590 if ( os.name == 'posix' ):
591 dotFilename='.lilyrc'
592 else: # Windows apps like edit choke on .lilyrc
593 dotFilename='_lilyrc'
595 for d in [os.path.join(this.get('root'),'ly'), \
596 os.environ['HOME'], os.curdir ]:
597 file=os.path.join(d,dotFilename)
599 fd = open( file, 'r' )
603 for line in fd.readlines():
604 if re.match('#.*',line):
606 m=re.search('([\w]+)=(.*)',line)
609 if m.group(1) == var[0]:
610 var[1](m.group(2),'rcfile')
617 def setPaperZize(this,size,requester):
619 Set paper size properties
623 # regex width height name
624 # ----- ----- ------ ----
625 ( 'a0.*', 2389, 3381, 'a0paper' ),
626 ( 'a1$|a1p.*', 1690, 2389, 'a1paper' ),
627 ( 'a2.*', 1194, 1690, 'a2paper' ),
628 ( 'a3.*', 845, 1194, 'a3paper' ),
629 ( 'a4.*', 597, 845, 'a4paper' ),
630 ( 'a5.*', 423, 597, 'a5paper' ),
631 ( 'a6.*', 298, 423, 'a6paper' ),
632 ( 'a7.*', 211, 298, 'a7paper' ),
633 ( 'a8.*', 305, 211, 'a8paper' ),
634 ( 'a9.*', 105, 305, 'a9paper' ),
635 ( 'a10.*', 74, 105, 'a10paper' ),
636 ( 'b0.*', 2847, 4023, 'b0paper' ),
637 ( 'b1.*', 2012, 2847, 'b1paper' ),
638 ( 'b2.*', 1423, 2012, 'b2paper' ),
639 ( 'b3.*', 1006, 1423, 'b3paper' ),
640 ( 'b4.*', 712, 1006, 'b4paper' ),
641 ( 'b5.*', 503, 712, 'b5paper' ),
642 ( 'archA$', 650, 867, 'archApaper' ),
643 ( 'archB$', 867, 1301, 'archBpaper' ),
644 ( 'archC$', 1301, 1734, 'archCpaper' ),
645 ( 'archD$', 1734, 2602, 'archDpaper' ),
646 ( 'archE$', 2602, 3469, 'archEpaper' ),
647 ( 'flsa$|flse$', 614, 940, 'flsapaper' ),
648 ( 'halfletter$', 397, 614, 'halfletterpaper' ),
649 ( 'ledger$', 1229, 795, 'ledgerpaper' ),
650 ( 'legal$', 614, 1012, 'legalpaper' ),
651 ( 'letter$', 614, 795, 'letterpaper' ),
652 ( 'note$', 542, 723, 'notepaper' )
656 for paper in paperTable:
657 if re.match(paper[0],size):
659 this.__set('papersize',paper[3],requester)
663 sys.exit('ExitBadPaper',size)
668 def setTextHeight(this,size,requester):
670 Set textheight property
673 m=re.match('([0-9][.0-9]*)(cm|mm|pt|$)',size)
675 if m.group(2) == 'cm':
676 this.__set('textheight',\
677 float(m.group(1)) * 72.27/2.54, requester )
678 elif m.group(2) == 'mm':
679 this.__set('textheight',\
680 float(m.group(1)) * 72.27/25.4, requester )
681 elif m.group(2) == 'pt':
682 this.__set('textheight', float(m.group(1)), requester )
683 elif m.group(2) == '':
684 this.__set('textheight', float(m.group(1)), requester )
686 sys.exit('ExitBadHeight', m.group(2))
688 sys.exit('ExitBadHeight', size)
693 def setLineWidth(this,size,requester):
695 Set linewidth propery
698 m=re.match('([0-9][.0-9]*)(cm|mm|pt|$)',size)
700 if m.group(2) == 'cm':
701 this.__set('linewidth', \
702 float(m.group(1)) * 72.27/2.54, requester )
703 elif m.group(2) == 'mm':
704 this.__set('linewidth', \
705 float(m.group(1)) * 72.27/25.4, requester )
706 elif m.group(2) == 'pt':
707 this.__set('linewidth', float(m.group(1)), requester )
708 elif m.group(2) == '':
709 this.__set('linewidth', float(m.group(1)), requester )
711 sys.exit('ExitBadWidth', m.group(2))
713 sys.stderr.write ('ly2dvi: warning: ignoring linewidth: ' + size + '\n')
718 def setOrientation(this,orient,requester):
720 Set orientation property
723 if orient == 'landscape' or orient == 'portrait':
724 this.__set('orientation', orient, requester )
726 sys.exit('ExitBadOrient', orient)
731 def setLanguage(this,lang,requester):
733 Set language property
736 this.__set('language', '\\usepackage[%s]{babel}' % (lang), requester )
741 def setInclude(this,inc, requester):
743 Append an include path
746 tmp = this.get('include')
748 this.__set('include', tmp, requester )
753 def setDebug(this,value,requester):
755 Set or Clear debug flag
759 this.__set('debug',1,requester)
761 this.__set('debug',0,requester)
766 def setKeeplilypond(this, value, requester):
768 Set or Clear keeplilypond flag
772 this.__set('keeplilypond',1,requester)
774 this.__set('keeplilypond',0,requester)
779 def setKeeply2dvi(this, value, requester):
781 Set or Clear keeply2dvi flag
785 this.__set('keeply2dvi',1,requester)
787 this.__set('keeply2dvi',0,requester)
792 def setNonumber(this, value, requester):
798 this.__set('pagenumber','\\pagestyle{empty}',requester)
800 this.__set('pagenumber','%',requester)
805 def setSeparate(this, value, requester):
807 Set or Clear separate flag
811 this.__set('separate',1,requester)
813 this.__set('separate',0,requester)
816 # Set output directory name
818 def setOutput(this,out,requester):
819 this.__set('output',out,requester)
822 # Set latex header name
824 def setHeader(this,head, requester):
825 this.__set('header','\\input{' + head + '}',requester)
828 # Set or Clear Dependencies flag to generate makefile dependencies
830 def setDependencies(this, value, requester):
832 Set or Clear dependencies flag
836 this.__set('dependencies',1,requester)
838 this.__set('dependencies',0,requester)
843 def setTmp(this,dir, requester):
844 this.__set('tmp',dir,requester)
847 # Set lilypond source file name
849 def setFilename(this,file, requester):
850 this.__set('filename',file,requester)
855 def setTitles(this,titles, requester):
856 this.__set('titles',titles,requester)
861 def addLilyOutputFiles(this,filelist,requester):
863 Add a to the lily output list
866 tmp = this.get('lilyOutputFiles')
868 this.__set('lilyOutputFiles',tmp,requester)
871 # Set/Clear postscript flag
873 def setPostscript(this,value,requester):
879 this.__set('postscript',1,requester)
881 this.__set('postscript',0,requester)
886 def setRoot(this,path, requester):
888 Set LilyPond root directory
891 os.environ['LILYPONDPREFIX'] = path
892 if os.name == 'nt' or os.name == 'dos':
893 path = unc2dos(path);
895 this.__set('root',path,requester)
901 def printProps(this):
906 for key in this.__data.keys():
907 print "%s <%s>:<%s>" % (key,this.get(key),
908 this.__roverrideTable[this.__data[key][1]])
918 if len(Props.get('include')) > 0:
919 inc = string.join (map (lambda x: '-I "%s"' % x, Props.get('include')))
922 if Props.get('dependencies'):
929 def writeLilylog(file,contents):
930 if Props.get('keeplilypond'):
931 base, ext = os.path.splitext(file)
932 tempfile.template=base + "_li"
933 file=tempfile.mktemp('.log')
934 output = Props.get('output')
936 file = os.path.join( output, file )
938 fd = open( file, 'w' )
940 sys.exit('ExitNoWrite', file)
944 def getTeXFile(contents):
946 for line in string.split(contents,'\n'):
947 m = re.search('paper output to (.+)\.\.\.', line)
949 texfiles.append(m.group(1))
952 sys.exit('ExitNoTeXName')
958 Convert a path of format //<drive>/this/that/the/other to
959 <drive>:\this\that\the\other
961 m=re.match('^//([A-Za-z])(/.*)$',path)
963 return m.group(1) + ':' + os.path.normpath(m.group(2))
968 return 'ly2dvi (GNU LilyPond) ' + version;
973 return os.environ['MAILADDRESS']
975 return '(address unknown)'
979 sys.stderr.write (program_id () + '\n')
981 def print_version ():
982 sys.stdout.write (program_id () + '\n')
986 """Usage: %s [OPTION]... [FILE]...
988 Generate dvi file from LilyPond source/output
991 -D,--debug increase verbosity
992 -F,--headers= name of additional LaTeX headers file
993 -H,--Height= set paper height (points) (see manual page)
994 -I,--include=DIR add DIR to LilyPond\'s search path
995 -K,--keeplilypond keep LilyPond output files
996 -L,--landscape set landscape orientation
997 -N,--nonumber switch off page numbering
998 -O,--orientation= set orientation (obsolete -- use -L instead)
999 -P,--postscript generate PostScript file
1000 -W,--Width= set paper width (points) (see manual page)
1001 -M,--dependencies tell LilyPond to make a dependencies file
1002 -h,--help this help text
1003 -k,--keeply2dvi keep ly2dvi output files
1004 -l,--language= give LaTeX language (babel)
1005 -o,--output= set output directory
1006 -p,--papersize= give LaTeX papersize (eg. a4)
1007 -s,--separate run all files separately through LaTeX
1009 files may be (a mix of) input to or output from LilyPond(1)
1019 """Generate dvi files from LilyPond source/output"""
1022 outfile = TeXOutput()
1026 (options, files) = getopt.getopt (sys.argv[1:],
1027 'DF:H:I:KLNPW:Mhkl:o:p:s',
1028 ['debug', 'headers=', 'Height=',
1029 'include=', 'keeplilypond', 'landscape',
1030 'nonumber', 'Width=', 'dependencies',
1031 'help', 'keeply2dvi', 'language=',
1032 'output=', 'version', 'papersize=', 'separate',
1038 if o == '--debug' or o == '-D':
1039 Props.setDebug(1,'commandline')
1040 elif o == '--headers' or o == '-F':
1041 Props.setHeader(a,'commandline')
1042 elif o == '--include' or o == '-I':
1043 Props.setInclude(a,'commandline')
1044 elif o == '--Height' or o == '-H':
1045 Props.setTextHeight(a,'commandline')
1046 elif o == '--keeplilypond' or o == '-K':
1047 Props.setKeeplilypond(1,'commandline')
1048 elif o == '--landscape' or o == '-L':
1049 Props.setOrientation('landscape','commandline')
1050 elif o == '--nonumber' or o == '-N':
1051 Props.setNonumber(1,'commandline')
1052 elif o == '--Width' or o == '-W':
1053 Props.setLineWidth(a,'commandline')
1054 elif o == '--dependencies' or o == '-M':
1055 Props.setDependencies(1,'commandline')
1056 elif o == '--help' or o == '-h':
1059 elif o == '--keeply2dvi' or o == '-k':
1060 Props.setKeeply2dvi(1,'commandline')
1061 elif o == '--language' or o == '-l':
1062 Props.setLanguage(a,'commandline')
1063 elif o == '--output' or o == '-o':
1064 Props.setOutput(a,'commandline')
1065 elif o == '--papersize' or o == '-p':
1066 Props.setPaperZize(a,'commandline')
1067 elif o == '--separate' or o == '-s':
1068 Props.setSeparate(1,'commandline')
1069 elif o == '--postscript' or o == '-P':
1070 Props.setPostscript(1,'commandline')
1071 elif o == '--version':
1079 Props.read_titledefs ()
1084 type = infile.type()
1086 if type == 'source':
1087 if os.environ.has_key('OS') and \
1088 os.environ['OS'] == 'Windows_95':
1089 cmd = 'ash -c "lilypond %s %s 2>&1"' %(getLilyopts(), file)
1091 cmd = 'lilypond %s %s 2>&1' % (getLilyopts(), file)
1092 sys.stderr.write ('executing: %s\n'% cmd)
1094 fd = os.popen(cmd , 'r')
1099 sys.stderr.write (s)
1106 sys.stderr.write (s)
1112 sys.exit('ExitBadLily', cmd )
1113 texFiles=getTeXFile(log)
1114 writeLilylog(file,log)
1115 Props.addLilyOutputFiles(texFiles,'program')
1116 texInputFiles = texInputFiles + texFiles
1118 texInputFiles.append(file)
1121 for file in texInputFiles:
1123 infile.setVars() # first pass set variables
1125 if Props.get('debug'):
1128 outfile.start(file) # allow for specified name
1134 if Props.get('separate'):
1138 if not Props.get('separate'):
1142 sys.exit('ExitBadArgs','No files specified')
1148 'ExitInterupt' : ['Ouch!', 1 ],
1149 'ExitBadArgs' : ['Wrong number of arguments', 2 ],
1150 'ExitNotFound' : ['File not found', 3 ],
1151 'ExitBadPaper' : ['Unknown papersize', 4 ],
1152 'ExitBadHeight' : ['Invalid Height specification', 5 ],
1153 'ExitBadWidth' : ['Invalid Width specification', 6 ],
1154 'ExitBadOrient' : ['Invalid Orientation specification', 7 ],
1155 'ExitNoWrite' : ['Permission denied', 8 ],
1156 'ExitNoTeXName' : ['Hmm, I could not find an output file name', 9 ],
1157 'ExitBadLily' : ['LilyPond failed', 10 ],
1158 'ExitBadLatex' : ['Latex failed', 11 ],
1159 'ExitBadPostscript' : ['Postscript failed', 12 ],
1160 'ExitUnknown' : ['Unknown Exit Code', 20 ],
1166 if not Props.get('keeplilypond'):
1167 lilyfiles = Props.get('lilyOutputFiles')
1168 if not Props.get('keeply2dvi'):
1169 tmpfiles = glob.glob('*_ly[0-9]*.*')
1170 for file in lilyfiles + tmpfiles:
1171 if os.path.isfile(file):
1175 Props = Properties()
1180 except KeyboardInterrupt:
1181 print ExitTable['ExitInterupt'][0]
1183 sys.exit(ExitTable['ExitInterupt'][1])
1185 except SystemExit, errno:
1186 if ExitTable.has_key(errno.args[0]):
1187 msg = ExitTable[errno.args[0]]
1189 msg = ExitTable['ExitUnknown']
1190 if len(errno.args) > 1:
1191 sys.stderr.write( '%s: %s: %s\n' % (name, msg[0], errno.args[1]))
1193 sys.stderr.write( '%s %s\n' % (name, msg[0]))
1194 if Props.get('debug'):