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 # user generated 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('% Generated automatically 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 ( 'latexpackages', Props.setPackages ),
149 ( 'paperorientation', Props.setOrientation ),
150 ( 'paperpapersize', Props.setPaperZize ),
151 ( 'papertextheight', Props.setTextHeight ),
152 ( 'paperlinewidth', Props.setLineWidth ),
153 ( 'filename', Props.setFilename ),
157 for line in this.__fd.readlines():
158 m=re.match('\\\\def\\\\lilypond([\w]+){(.*)}',line)
161 if m.group(1) == var[0]:
162 var[1](m.group(2),'file')
164 for var in Props.get('titledefs'):
165 if m.group(1) == var:
166 titles[var]=m.group(2)
168 Props.setTitles(titles,'file')
175 This class handles all ly2dvi.py output file methods
178 __lilypondDefs(opt) Send title info to output file
181 __init__() Constructor
182 write(str) Write a string to output file
183 start(file) Start the latex file
184 next() Process next output file
185 end() Finish latex file and run latex
199 def __lilypondDefs(this,opt):
201 Write titles to output
203 input: opt Supports header and subheader output
208 titles = Props.get('titles')
209 for key in titles.keys():
210 this.write('%s\\lilypond%s{%s}%%\n' % (opt,key,titles[key]))
217 Write str to current output file
219 input: str String to write
229 def start(this,file):
231 Start LaTeX file. Sets the linewidth (and possibly the
232 textheight) and leaves the page layout to the geometry
233 package. Creates temporary output filename and opens it
234 for write. Sends the LaTeX header information to output.
235 Lastly sends the title information to output.
237 input: file output file name
242 now=time.asctime(time.localtime(time.time()))
244 # Only set the textheight if it was explicitly set by the user,
245 # otherwise use the default. Helps to handle landscape correctly!
246 if Props.get('textheight') > 0:
247 textheightsetting = ',textheight=' + `Props.get('textheight')` + 'pt'
249 textheightsetting = ''
254 %% Generated automatically by: %s, from %s, at %s
256 \documentclass[%s]{article}
259 \usepackage{geometry}
260 \usepackage[latin1]{inputenc}
261 %%\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}}%%
279 """ % ( program_id(), program_id(), Props.get('filename'), now, Props.get('papersize'),
280 Props.get('language'), Props.get('linewidth'), textheightsetting,
281 Props.get('orientation'), Props.get('header'), Props.get('pagenumber'))
283 base, ext = os.path.splitext(file)
285 tempfile.template= base + '_ly'
286 this.__outfile = tempfile.mktemp(ext)
287 base, ext = os.path.splitext(this.__outfile)
288 this.__tmpbase = base
290 this.__fd = open(this.__outfile,"w")
292 sys.exit('ExitNoWrite', this.__outfile)
294 this.__lilypondDefs('')
304 Write LaTeX subheader information to support more than one
305 score in a document. Lastly send current title information to
316 \\def\\lilypondopus{}%
317 \\def\\lilypondpiece{}%
319 this.__lilypondDefs("\\def")
321 \\def\\theopus{\\lilypondopus}% ugh
322 \\def\\thepiece{\\lilypondpiece}%
332 Close output file and run latex on it.
336 error: ExitBadLatex Exception
339 outfile=this.__base + '.dvi'
340 if Props.get('output') != '':
341 if not os.path.exists(Props.get('output')):
342 os.mkdir(Props.get('output'))
344 outfile = os.path.join(Props.get('output'), outfile )
347 %% \vfill\hfill{\lilypondtagline}
349 \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\lilypondtagline}}%%
354 if os.path.isfile(outfile):
356 if ( os.name == 'posix' ):
357 stat = os.system('latex \'\\nonstopmode \\input %s\'' %
359 else: # Windows shells don't eat the single quotes
360 stat = os.system('latex \\nonstopmode \\input %s' %
363 sys.exit('ExitBadLatex')
364 if not os.path.isfile(outfile):
365 os.rename(this.__tmpbase + '.dvi', outfile)
367 sys.stderr.write('\n' + program_id() + ': dvi file name is %s\n\n'
370 if Props.get('postscript'):
372 if Props.get('orientation') == 'landscape':
373 dvipsopts=dvipsopts + ' -t landscape'
374 psoutfile=this.__base + '.ps'
375 if Props.get('output') != '':
376 psoutfile = os.path.join(Props.get('output'), psoutfile )
377 stat = os.system('dvips %s -o %s %s' % (dvipsopts,psoutfile,outfile))
379 sys.exit('ExitBadPostscript')
385 # ARG! THIS CODE IS BLOATED:
386 # FIXME: Junk all set/get methods.
390 This class handles all ly2dvi.py property manipulation
394 __init__() Constructor
395 set<property> methods
401 # Following is the order of priority for property assignment. The
402 # list is organized from lowest to highest priority. Each
403 # assignment is overridden by the next requester in the list.
405 # Requester Description
406 # --------- -----------
407 # init Initial default values
408 # file The values found in the LilyPond generated TeX files
409 # environment Envrionment variables LILYINCLUDE, LILYPONDPREFIX
410 # rcfile $LILYPONDPREFIX/.lilyrc
411 # rcfile $HOME/.lilyrc
413 # commandline command line arguments
415 this.__overrideTable = {
424 this.__roverrideTable = {} # reverse lookup used for debug
425 for i in this.__overrideTable.items():
426 this.__roverrideTable[i[1]]=i[0]
429 'papersize' : ['a4paper', this.__overrideTable['init']],
430 'textheight' : [0, this.__overrideTable['init']],
431 'linewidth' : [500, this.__overrideTable['init']],
432 'orientation' : ['portrait', this.__overrideTable['init']],
433 'language' : ['%', this.__overrideTable['init']],
434 'include' : [[], this.__overrideTable['init']],
435 'debug' : [0, this.__overrideTable['init']],
436 'keeplilypond' : [0, this.__overrideTable['init']],
437 'keeply2dvi' : [0, this.__overrideTable['init']],
438 'pagenumber' : ['%', this.__overrideTable['init']],
439 'separate' : [0, this.__overrideTable['init']],
440 'output' : ['', this.__overrideTable['init']],
441 'header' : ['%', this.__overrideTable['init']],
442 'dependencies' : [0, this.__overrideTable['init']],
443 'root' : ['', this.__overrideTable['init']],
444 'tmp' : ['d:\tmp', this.__overrideTable['init']],
445 'filename' : ['', this.__overrideTable['init']],
446 'titledefs' : [[], this.__overrideTable['init']],
447 'titles' : [{}, this.__overrideTable['init']],
448 'lilyOutputFiles' : [[], this.__overrideTable['init']],
449 'postscript' : [0, this.__overrideTable['init']],
453 # Try to set root and HOME first before calling rcfile
455 if os.environ.has_key('LILYPONDPREFIX'):
456 this.setRoot(os.environ['LILYPONDPREFIX'], 'environment')
458 p=os.path.split(sys.argv[0])
459 p=os.path.split(p[0])
460 # bit silly. for ly2dvi, overrules compiled-in datadir...
461 # how to do this better (without running lily, of course?
462 this.setRoot(os.path.join(p[0],'share','lilypond'), 'init')
464 if not os.environ.has_key('HOME'):
465 if os.environ.has_key('HOMEDRIVE') and \
466 os.environ.has_key('HOMEPATH'):
467 os.environ['HOME'] = os.environ['HOMEDRIVE'] + \
468 os.environ['HOMEPATH']
470 os.environ['HOME'] = os.curdir
472 this.rcfile() # Read initialization file(s)
474 if os.environ.has_key('LILYINCLUDE'):
475 tmp=this.get('include')
476 for s in string.split(os.environ['LILYINCLUDE'],os.pathsep):
478 this.__set('include', tmp, 'environment')
482 if os.environ.has_key ('TEXINPUTS'):
483 t = os.environ['TEXINPUTS'] + os.pathsep
486 os.path.join(this.get('root'), 'tex' ) + \
487 os.pathsep + os.path.join(this.get('root'), 'ps' )
488 # Don't add the magic `//' to TEXINPUTS
489 ly2dvi_t = re.sub ('//*', '/', ly2dvi_t)
490 os.environ['TEXINPUTS'] = ly2dvi_t
493 if os.environ.has_key ('MFINPUTS'):
494 m = os.environ['MFINPUTS']
495 ly2dvi_m = m + os.pathsep + \
496 os.path.join(this.get('root'), 'mf')
497 ly2dvi_m = re.sub ('//*', '/', ly2dvi_m)
498 # Don't add the magic `//' to MFINPUTS
499 os.environ['MFINPUTS'] = ly2dvi_m
501 if os.environ.has_key('TMP'):
502 this.__set('tmp',os.environ['TMP'],'environment')
505 def read_titledefs (this):
506 fd=this.get_texfile_path ('titledefs.tex')
509 for line in fd.readlines():
510 m=re.match('\\\\newcommand\*{\\\\lilypond([\w]+)}',line)
512 mudefs.append(m.group(1))
514 this.__set('titledefs', mudefs, 'init')
519 def __set(this,var,value,requester):
521 All of the set methods call this to set a property. If the value
522 was last set by a requestor of lesser priority the new value is
523 assigned, else the old value has priority and is unchanged.
526 if this.__overrideTable[requester] < this.__data[var][1]:
529 this.__data[var] = [value, this.__overrideTable[requester]]
536 All of the get methods call this to get a property value. List
537 variable types are return by value to facilitate an append operation.
540 if var == 'include' or var == 'lilyOutputFiles':
541 return this.__data[var][0][0:] # return a copy not a ref
543 return this.__data[var][0]
548 def get_texfile_path (this, var):
550 locate and open titledefs.tex file
554 path = os.path.join(this.get('root'), 'tex', var)
557 cmd =('kpsewhich tex %s %s' % (var,errorlog))
558 sys.stderr.write ('executing: %s'% cmd)
559 pipe = os.popen (cmd, 'r')
560 path = pipe.readline ()[:-1] # chop off \n
561 return_status = pipe.close()
562 sys.stderr.write ('\n')
563 if return_status and not path:
564 path = os.path.join(this.get('root'), 'tex', var)
574 Read initialization file(s)
579 ( 'DEBUG', this.setDebug ),
580 ( 'DEPENDENCIES', this.setDependencies ),
581 ( 'KEEPLILYPOND', this.setKeeplilypond ),
582 ( 'KEEPLY2DVI', this.setKeeply2dvi ),
583 ( 'LANGUAGE', this.setLanguage ),
584 ( 'LATEXHF', this.setHeader ),
585 ( 'LATEXPKG', this.setPackages ),
586 ( 'LILYINCLUDE', this.setInclude ),
587 ( 'LILYPONDPREFIX', this.setRoot ),
588 ( 'NONUMBER', this.setNonumber ),
589 ( 'ORIENTATION', this.setOrientation ),
590 ( 'OUTPUTDIR', this.setOutput ),
591 ( 'PAPERSIZE', this.setPaperZize ),
592 ( 'PHEIGHT', this.setTextHeight ),
593 ( 'POSTSCRIPT', this.setPostscript ),
594 ( 'PWIDTH', this.setLineWidth ),
595 ( 'SEPARATE', this.setSeparate ),
596 ( 'TMP', this.setTmp ),
599 if ( os.name == 'posix' ):
600 dotFilename='.lilyrc'
601 else: # Windows apps like edit choke on .lilyrc
602 dotFilename='_lilyrc'
604 for d in [os.path.join(this.get('root'),'ly'), \
605 os.environ['HOME'], os.curdir ]:
606 file=os.path.join(d,dotFilename)
608 fd = open( file, 'r' )
612 for line in fd.readlines():
613 if re.match('#.*',line):
615 m=re.search('([\w]+)=(.*)',line)
618 if m.group(1) == var[0]:
619 var[1](m.group(2),'rcfile')
626 def setPaperZize(this,size,requester):
628 Set paper size properties
632 # regex width height name
633 # ----- ----- ------ ----
634 ( 'a0.*', 2389, 3381, 'a0paper' ),
635 ( 'a1$|a1p.*', 1690, 2389, 'a1paper' ),
636 ( 'a2.*', 1194, 1690, 'a2paper' ),
637 ( 'a3.*', 845, 1194, 'a3paper' ),
638 ( 'a4.*', 597, 845, 'a4paper' ),
639 ( 'a5.*', 423, 597, 'a5paper' ),
640 ( 'a6.*', 298, 423, 'a6paper' ),
641 ( 'a7.*', 211, 298, 'a7paper' ),
642 ( 'a8.*', 305, 211, 'a8paper' ),
643 ( 'a9.*', 105, 305, 'a9paper' ),
644 ( 'a10.*', 74, 105, 'a10paper' ),
645 ( 'b0.*', 2847, 4023, 'b0paper' ),
646 ( 'b1.*', 2012, 2847, 'b1paper' ),
647 ( 'b2.*', 1423, 2012, 'b2paper' ),
648 ( 'b3.*', 1006, 1423, 'b3paper' ),
649 ( 'b4.*', 712, 1006, 'b4paper' ),
650 ( 'b5.*', 503, 712, 'b5paper' ),
651 ( 'archA$', 650, 867, 'archApaper' ),
652 ( 'archB$', 867, 1301, 'archBpaper' ),
653 ( 'archC$', 1301, 1734, 'archCpaper' ),
654 ( 'archD$', 1734, 2602, 'archDpaper' ),
655 ( 'archE$', 2602, 3469, 'archEpaper' ),
656 ( 'flsa$|flse$', 614, 940, 'flsapaper' ),
657 ( 'halfletter$', 397, 614, 'halfletterpaper' ),
658 ( 'ledger$', 1229, 795, 'ledgerpaper' ),
659 ( 'legal$', 614, 1012, 'legalpaper' ),
660 ( 'letter$', 614, 795, 'letterpaper' ),
661 ( 'note$', 542, 723, 'notepaper' )
665 for paper in paperTable:
666 if re.match(paper[0],size):
668 this.__set('papersize',paper[3],requester)
672 sys.exit('ExitBadPaper',size)
677 def setTextHeight(this,size,requester):
679 Set textheight property
682 m=re.match('([0-9][.0-9]*)(cm|mm|pt|$)',size)
684 if m.group(2) == 'cm':
685 this.__set('textheight',\
686 float(m.group(1)) * 72.27/2.54, requester )
687 elif m.group(2) == 'mm':
688 this.__set('textheight',\
689 float(m.group(1)) * 72.27/25.4, requester )
690 elif m.group(2) == 'pt':
691 this.__set('textheight', float(m.group(1)), requester )
692 elif m.group(2) == '':
693 this.__set('textheight', float(m.group(1)), requester )
695 sys.exit('ExitBadHeight', m.group(2))
697 sys.exit('ExitBadHeight', size)
702 def setLineWidth(this,size,requester):
704 Set linewidth propery
707 m=re.match('([0-9][.0-9]*)(cm|mm|pt|$)',size)
709 if m.group(2) == 'cm':
710 this.__set('linewidth', \
711 float(m.group(1)) * 72.27/2.54, requester )
712 elif m.group(2) == 'mm':
713 this.__set('linewidth', \
714 float(m.group(1)) * 72.27/25.4, requester )
715 elif m.group(2) == 'pt':
716 this.__set('linewidth', float(m.group(1)), requester )
717 elif m.group(2) == '':
718 this.__set('linewidth', float(m.group(1)), requester )
720 sys.exit('ExitBadWidth', m.group(2))
722 sys.stderr.write ('ly2dvi: warning: ignoring linewidth: ' + size + '\n')
727 def setOrientation(this,orient,requester):
729 Set orientation property
732 if orient == 'landscape' or orient == 'portrait':
733 this.__set('orientation', orient, requester )
735 sys.exit('ExitBadOrient', orient)
740 def setLanguage(this,lang,requester):
742 Set language property
745 this.__set('language', '\\usepackage[%s]{babel}' % (lang), requester )
750 def setInclude(this,inc, requester):
752 Append an include path
755 tmp = this.get('include')
757 this.__set('include', tmp, requester )
762 def setDebug(this,value,requester):
764 Set or Clear debug flag
768 this.__set('debug',1,requester)
770 this.__set('debug',0,requester)
775 def setKeeplilypond(this, value, requester):
777 Set or Clear keeplilypond flag
781 this.__set('keeplilypond',1,requester)
783 this.__set('keeplilypond',0,requester)
788 def setKeeply2dvi(this, value, requester):
790 Set or Clear keeply2dvi flag
794 this.__set('keeply2dvi',1,requester)
796 this.__set('keeply2dvi',0,requester)
801 def setNonumber(this, value, requester):
807 this.__set('pagenumber','\\pagestyle{empty}',requester)
809 this.__set('pagenumber','%',requester)
814 def setSeparate(this, value, requester):
816 Set or Clear separate flag
820 this.__set('separate',1,requester)
822 this.__set('separate',0,requester)
825 # Set output directory name
827 def setOutput(this,out,requester):
828 this.__set('output',out,requester)
831 # Set latex header name
833 def setHeader(this,head, requester):
834 this.__set('header','\\input{' + head + '}'+this.get('header'),requester)
837 # Set latex package name
839 def setPackages(this,pkgs, requester):
840 this.__set('header','\\usepackage{' + pkgs + '}'+this.get('header'),requester)
843 # Set or Clear Dependencies flag to generate makefile dependencies
845 def setDependencies(this, value, requester):
847 Set or Clear dependencies flag
851 this.__set('dependencies',1,requester)
853 this.__set('dependencies',0,requester)
858 def setTmp(this,dir, requester):
859 this.__set('tmp',dir,requester)
862 # Set lilypond source file name
864 def setFilename(this,file, requester):
865 this.__set('filename',file,requester)
870 def setTitles(this,titles, requester):
871 this.__set('titles',titles,requester)
876 def addLilyOutputFiles(this,filelist,requester):
878 Add a to the lily output list
881 tmp = this.get('lilyOutputFiles')
883 this.__set('lilyOutputFiles',tmp,requester)
886 # Set/Clear postscript flag
888 def setPostscript(this,value,requester):
894 this.__set('postscript',1,requester)
896 this.__set('postscript',0,requester)
901 def setRoot(this,path, requester):
903 Set LilyPond root directory
906 os.environ['LILYPONDPREFIX'] = path
907 if os.name == 'nt' or os.name == 'dos':
908 path = unc2dos(path);
910 this.__set('root',path,requester)
916 def printProps(this):
921 for key in this.__data.keys():
922 print "%s <%s>:<%s>" % (key,this.get(key),
923 this.__roverrideTable[this.__data[key][1]])
933 if len(Props.get('include')) > 0:
934 inc = string.join (map (lambda x: '-I "%s"' % x, Props.get('include')))
936 if Props.get('dependencies'):
937 dep=' --dependencies'
940 def writeLilylog(file,contents):
941 if Props.get('keeplilypond'):
942 base, ext = os.path.splitext(file)
943 tempfile.template=base + "_li"
944 file=tempfile.mktemp('.log')
945 output = Props.get('output')
947 file = os.path.join( output, file )
949 fd = open( file, 'w' )
951 sys.exit('ExitNoWrite', file)
955 def getTeXFile(contents):
957 for line in string.split(contents,'\n'):
958 m = re.search('paper output to (.+)\.\.\.', line)
960 texfiles.append(m.group(1))
963 sys.exit('ExitNoTeXName')
967 def getDepFiles (log):
969 for line in string.split (log,'\n'):
970 m = re.search ("dependencies output to (.+)\.\.\.", line)
972 files.append (m.group (1))
977 Convert a path of format //<drive>/this/that/the/other to
978 <drive>:\this\that\the\other
980 m=re.match('^//([A-Za-z])(/.*)$',path)
982 return m.group(1) + ':' + os.path.normpath(m.group(2))
987 return 'ly2dvi (GNU LilyPond) ' + version;
992 return os.environ['MAILADDRESS']
994 return '(address unknown)'
998 sys.stderr.write (program_id () + '\n')
1000 def print_version ():
1001 sys.stdout.write (program_id () + '\n')
1005 """Usage: %s [OPTION]... [FILE]...
1007 Generate dvi file from LilyPond source/output
1010 -D,--debug increase verbosity
1011 -F,--headers= name of additional LaTeX headers file
1012 -H,--Height= set paper height (points) (see manual page)
1013 -I,--include=DIR add DIR to LilyPond\'s search path
1014 -K,--keeplilypond keep LilyPond output files
1015 -L,--landscape set landscape orientation
1016 -N,--nonumber switch off page numbering
1017 -O,--orientation= set orientation (obsolete -- use -L instead)
1018 -P,--postscript generate PostScript file
1019 -W,--Width= set paper width (points) (see manual page)
1020 -M,--dependencies tell LilyPond to make a dependencies file
1021 -h,--help this help text
1022 -k,--keeply2dvi keep ly2dvi output files
1023 -l,--language= give LaTeX language (babel)
1024 -o,--outdir= set output directory
1025 --output= set output directory
1026 -p,--papersize= give LaTeX papersize (eg. a4)
1027 -s,--separate run all files separately through LaTeX
1029 files may be (a mix of) input to or output from LilyPond(1)
1039 """Generate dvi files from LilyPond source/output"""
1042 outfile = TeXOutput()
1046 (options, files) = getopt.getopt (sys.argv[1:],
1047 'DF:H:I:KLNPW:Mhkl:o:p:s',
1048 ['debug', 'headers=', 'Height=',
1049 'include=', 'keeplilypond', 'landscape',
1050 'nonumber', 'Width=', 'dependencies',
1051 'help', 'keeply2dvi', 'language=',
1052 'outdir=', 'output=', 'version',
1053 'papersize=', 'separate', 'postscript'])
1058 if o == '--debug' or o == '-D':
1059 Props.setDebug(1,'commandline')
1060 elif o == '--headers' or o == '-F':
1061 Props.setHeader(a,'commandline')
1062 elif o == '--include' or o == '-I':
1063 Props.setInclude(a,'commandline')
1064 elif o == '--Height' or o == '-H':
1065 Props.setTextHeight(a,'commandline')
1066 elif o == '--keeplilypond' or o == '-K':
1067 Props.setKeeplilypond(1,'commandline')
1068 elif o == '--landscape' or o == '-L':
1069 Props.setOrientation('landscape','commandline')
1070 elif o == '--nonumber' or o == '-N':
1071 Props.setNonumber(1,'commandline')
1072 elif o == '--Width' or o == '-W':
1073 Props.setLineWidth(a,'commandline')
1074 elif o == '--dependencies' or o == '-M':
1075 Props.setDependencies(1,'commandline')
1076 elif o == '--help' or o == '-h':
1079 elif o == '--keeply2dvi' or o == '-k':
1080 Props.setKeeply2dvi(1,'commandline')
1081 elif o == '--language' or o == '-l':
1082 Props.setLanguage(a,'commandline')
1083 elif o == '--outdir' or o == '-o' or o == '--output':
1084 Props.setOutput(a,'commandline')
1085 elif o == '--papersize' or o == '-p':
1086 Props.setPaperZize(a,'commandline')
1087 elif o == '--separate' or o == '-s':
1088 Props.setSeparate(1,'commandline')
1089 elif o == '--postscript' or o == '-P':
1090 Props.setPostscript(1,'commandline')
1091 elif o == '--version':
1099 Props.read_titledefs ()
1104 type = infile.type()
1106 if type == 'source':
1107 if os.environ.has_key('OS') and \
1108 os.environ['OS'] == 'Windows_95':
1109 cmd = 'ash -c "lilypond %s %s 2>&1"' %(getLilyopts(), file)
1111 cmd = 'lilypond %s %s 2>&1' % (getLilyopts(), file)
1112 sys.stderr.write ('executing: %s\n'% cmd)
1114 fd = os.popen(cmd , 'r')
1119 sys.stderr.write (s)
1126 sys.stderr.write (s)
1132 sys.exit('ExitBadLily', cmd )
1133 texFiles=getTeXFile(log)
1134 depFiles=getDepFiles (log)
1135 writeLilylog(file,log)
1136 Props.addLilyOutputFiles(texFiles,'program')
1137 texInputFiles = texInputFiles + texFiles
1139 texInputFiles.append(file)
1142 for file in texInputFiles:
1144 infile.setVars() # first pass set variables
1146 if Props.get('debug'):
1149 outfile.start(file) # allow for specified name
1155 if Props.get('separate'):
1159 if not Props.get('separate'):
1163 if Props.get ('output'):
1164 outdir=Props.get ('output')
1166 text=open (i).read ()
1167 # ugh, should use lilypond -o DIR/foo.tex
1168 # or --dep-prefix to fix dependencies
1169 text=re.sub ('\n([^:]*).tex', '\n' + outdir + '/\\1.dvi', text)
1170 text=re.sub (' ([^:]*).tex', ' ' + outdir + '/\\1.dvi', text)
1171 open (os.path.join (outdir, i), 'w').write (text)
1176 sys.exit('ExitBadArgs','No files specified')
1182 'ExitInterupt' : ['Ouch!', 1 ],
1183 'ExitBadArgs' : ['Wrong number of arguments', 2 ],
1184 'ExitNotFound' : ['File not found', 3 ],
1185 'ExitBadPaper' : ['Unknown papersize', 4 ],
1186 'ExitBadHeight' : ['Invalid Height specification', 5 ],
1187 'ExitBadWidth' : ['Invalid Width specification', 6 ],
1188 'ExitBadOrient' : ['Invalid Orientation specification', 7 ],
1189 'ExitNoWrite' : ['Permission denied', 8 ],
1190 'ExitNoTeXName' : ['Hmm, I could not find an output file name', 9 ],
1191 'ExitBadLily' : ['LilyPond failed', 10 ],
1192 'ExitBadLatex' : ['Latex failed', 11 ],
1193 'ExitBadPostscript' : ['Postscript failed', 12 ],
1194 'ExitUnknown' : ['Unknown Exit Code', 20 ],
1200 if not Props.get('keeplilypond'):
1201 lilyfiles = Props.get('lilyOutputFiles')
1202 if not Props.get('keeply2dvi'):
1203 tmpfiles = glob.glob('*_ly[0-9]*.*')
1204 for file in lilyfiles + tmpfiles:
1205 if os.path.isfile(file):
1209 Props = Properties()
1214 except KeyboardInterrupt:
1215 print ExitTable['ExitInterupt'][0]
1217 sys.exit(ExitTable['ExitInterupt'][1])
1219 except SystemExit, errno:
1220 if ExitTable.has_key(errno.args[0]):
1221 msg = ExitTable[errno.args[0]]
1223 msg = ExitTable['ExitUnknown']
1224 if len(errno.args) > 1:
1225 sys.stderr.write( '%s: %s: %s\n' % (name, msg[0], errno.args[1]))
1227 sys.stderr.write( '%s %s\n' % (name, msg[0]))
1228 if Props.get('debug'):