]> git.donarmstrong.com Git - lilypond.git/blob - stepmake/bin/ls-latex.py
124317898c8827f2c7b30423bc501faf458aeb87
[lilypond.git] / stepmake / bin / ls-latex.py
1 #!@PYTHON@
2
3 # FIXME: 
4 #  name isn't really appropriate now ...
5 #  see mudela-book: cater for different formats in uniform way
6
7 name = 'ls-latex'
8 version = '0.1'
9
10 import sys
11 import os
12 import string
13
14 def gulp_file(f):
15         try:
16                 i = open(f)
17                 i.seek (0, 2)
18                 n = i.tell ()
19                 i.seek (0,0)
20         except:
21                 sys.stderr.write ("can't open file: %s\n" % f)
22                 return ''
23         s = i.read (n)
24         if len (s) <= 0:
25                 sys.stderr.write ("gulped emty file: %s\n" % f)
26         i.close ()
27         return s
28
29 import __main__
30 import glob
31 import regex
32
33 latex_author_re = regex.compile(r'\\author{\([^}]+\)}')
34 latex_title_re = regex.compile(r'\\title{\([^}]+\)}')
35
36 class Latex_head:
37     def __init__ (self):
38         self.author = ''
39         self.title = ''
40         self.date = ''
41         self.format = ''
42
43         
44 def read_latex_header (fn):
45     s = gulp_file (fn)
46     i = regex.search( '\\\\begin{document}', s)
47
48     if i < 0:
49         sys.stderr.write ("ls-latex: no \\begin{document} in %s\n" % fn)
50         s = "\\author{(unknown)}\\title{(file: %s)}" % fn
51         
52     s = s[:i]
53     s = regsub.gsub('%.*$', '', s)
54     s = regsub.gsub('\n', ' ', s)
55
56     header = Latex_head()
57     header.filename= fn;
58
59     if latex_author_re.search (s) == -1 :
60         sys.stderr.write ("ls-latex: can't find author in %s\n" % fn)
61         header.author = 'unknown'
62     else:
63         header.author = latex_author_re.group (1)
64     if latex_title_re.search (s) == -1:
65         sys.stderr.write ("ls-latex: can't find title in %s\n" % fn)
66         header.title = "(file: %s)" % fn
67     else:
68         header.title = latex_title_re.group (1)
69     header.outfile = fn
70     header.outfile = regsub.gsub ('\.latex$', '.ps.gz', header.outfile)
71     header.outfile = regsub.gsub ('\.tex$', '.ps.gz', header.outfile)
72     header.outfile = regsub.gsub ('\.doc$', '.ps.gz', header.outfile)
73     header.format = 'gzipped postscript'
74     return  header
75
76
77 bib_author_re = regex.compile('% *AUTHOR *= *\(.*\)$')
78 bib_title_re = regex.compile('% *TITLE *= *\(.*\)$')
79
80 def bib_header (fn):
81     s = gulp_file (fn)
82     if bib_author_re.search (s) == -1 :
83         sys.stderr.write ('gulped file: ' + fn + '\n')
84         raise 'huh?'
85
86     header = Latex_head()
87     header.filename= fn;
88     header.author = bib_author_re.group (1)
89     if bib_title_re.search (s) == -1:
90         sys.stderr.write ('gulped file: ' + fn + '\n')
91         raise 'huh?'    
92     header.title = bib_title_re.group (1)
93     header.outfile = regsub.gsub ( '\.bib$', '.html' , fn)
94     header.format = 'HTML'    
95     return header
96
97
98 def read_pod_header (fn):
99     header = Latex_head ()
100     s = gulp_file (fn)
101     i = regex.search( '[^\n \t]', s)
102     s = s[i:]
103     i = regex.search( '\n\n', s)
104     s = s[i+2:]    
105     if i < 0:
106         sys.stderr.write ('gulped file: ' + fn + '\n')
107         raise 'huh?'
108     i = regex.search( '\n\n', s)
109     header.title = s[:i]
110     header.filename = fn
111     header.outfile = regsub.gsub ('\.pod$', '.html', fn)
112     return  header
113
114 texinfo_author_re = regex.compile(r'^@author  *\(.*\) *$')
115 texinfo_title_re = regex.compile(r'^@title  *\(.*\) *$')
116
117 def read_texinfo_header (fn):
118     header = Latex_head ()
119     s = gulp_file (fn)
120     if texinfo_author_re.search (s) == -1 :
121         sys.stderr.write ("ls-latex: can't find author in %s\n" % fn)
122         header.author = 'unknown'
123     else:
124         header.author = texinfo_author_re.group (1)
125     if texinfo_title_re.search (s) == -1:
126         sys.stderr.write ("ls-latex: can't find title in %s\n" % fn)
127         header.title = "(file: %s)" % fn
128     i = regex.search( '@node ', s)
129     s = s[i+5:]
130     i = regex.search( ',', s)
131     if i < 0:
132         sys.stderr.write ('gulped file: ' + fn + '\n')
133         raise 'huh?'
134     if not header.title:
135         header.title = s[:i]
136     header.filename = fn
137     header.outfile = regsub.gsub ('\.texinfo$', '.html', fn)
138     header.format = 'HTML'
139     return  header
140
141 def read_tely_header (fn):
142     header = Latex_head ()
143     s = gulp_file (fn)
144     if texinfo_author_re.search (s) == -1 :
145         sys.stderr.write ("ls-latex: can't find author in %s\n" % fn)
146         header.author = 'unknown'
147     else:
148         header.author = texinfo_author_re.group (1)
149     if texinfo_title_re.search (s) == -1:
150         sys.stderr.write ("ls-latex: can't find title in %s\n" % fn)
151         header.title = "(file: %s)" % fn
152     i = regex.search( '@settitle', s)
153     s = s[i+10:]
154     i = regex.search( '\n', s)
155     if i < 0:
156         sys.stderr.write ('gulped file: ' + fn + '\n')
157         raise 'huh?'
158     if not header.title:
159         header.title = s[:i]
160     header.filename = fn
161     header.outfile = regsub.gsub ('\.tely', '.html', fn)
162     header.format = 'HTML'
163     return  header
164
165 # urg
166 # should make a 'next_parens'
167 yo_article_re = regex.compile('article(\\([^)]*\\))[ \t\n]*(\\([^)]*\\))')
168 yo_report_re = regex.compile('report(\\([^)]*\\))[\t\n ]*(\\([^)]*\\))')
169 yo_sect_re  =  regex.compile('sect(\\([^)]*\\))')
170 yo_chap_re  =  regex.compile('sect(\\([^)]*\\))')
171
172 def read_yo_header (fn):
173     header = Latex_head ()
174     s = gulp_file (fn)
175     if 0:
176             pass
177     elif yo_report_re.search (s) <> -1:
178             header.author = yo_report_re.group(2)
179             header.title = yo_report_re.group(1)
180     elif yo_article_re.search (s) <> -1:
181             header.author = yo_article_re.group(2)
182             header.title = yo_article_re.group(1)
183     elif yo_chap_re.search (s) <> -1:
184             header.title = yo_chap_re.group (1)
185     elif yo_sect_re.search (s) <> -1:
186             header.title = yo_sect_re.group (1)
187     header.filename = fn
188     header.outfile = regsub.gsub ('\.yo$', '.html', fn)
189     header.format = 'HTML'
190     return  header
191
192 def print_html_head (l,o,h):
193     pre =o
194
195     l.write ('<li><a href=%s>%s (%s)</a>' % (pre + h.outfile, h.title, h.format ))
196     if h.author:
197         l.write ('<p>by %s</p>' % h.author)
198     l.write ('</li>\n')
199
200 def help ():
201     sys.stdout.write ("Usage: ls-latex [OPTION]... FILE...\n"
202                  "Generate html index file for FILE...\n\n"
203                  + "Options:\n"
204                  + "  -h, --help             print this help\n"
205                  + "  -p, --package=DIR      specify package\n"
206                       )
207     sys.exit (0)
208
209 import getopt
210
211 (options, files) = getopt.getopt(sys.argv[1:], 
212     'e:hp:', ['help', 'prefix=', 'package=', 'title='])
213
214 tex = ''
215 output =''
216 pre = ''
217 title = ''
218 for opt in options:
219     o = opt[0]
220     a = opt[1]
221     if o == '--prefix':
222         pre = a
223     elif o == '--title':
224         title = a  
225     elif o == '-h' or o == '--help':
226         help ()
227     elif o == '-p' or o == '--package':
228         topdir = a
229
230 sys.path.append (topdir + '/stepmake/bin')
231 from packagepython import *
232 package = Package (topdir)
233 packager = Packager ()
234
235 l = sys.stdout
236
237 l.write ('<html><title>%s</title><h1> %s</h1><ul>\n' % (title, title))
238
239
240 for x in files:
241     if regex.search ('\\.bib$', x) <> -1:
242         head = bib_header (x)
243     elif regex.search ('\\.pod$', x) <> -1:
244         head = read_pod_header (x)
245     elif regex.search ('\\.texinfo$', x) <> -1:
246         head = read_texinfo_header (x)
247     elif regex.search ('\\.tely$', x) <> -1:
248         head = read_tely_header (x)
249     elif regex.search ('\\.yo$', x) <> -1:
250         head = read_yo_header (x)
251     else:
252         head = read_latex_header (x)
253     if head.title == '':
254         head.title = head.filename
255     print_html_head (l, pre, head)
256
257 l.write ('</ul></html>')
258