#!@PYTHON@
# mutopia-index.py
-name = 'mutopia-index'
-
-import find
-import re
+import fnmatch
+import getopt
import os
-import sys
+import os
+import re
import stat
+import sys
-def gulp_file (fn):
- try:
- f = open (fn)
- except:
- raise 'not there' , fn
- return f.read ()
+def find (pat, dir):
+ f = os.popen ('find %s -name "%s"'% (dir, pat))
+ lst = []
+ for a in f.readlines():
+ a = a[:-1]
+ lst.append (a)
+ return lst
-def file_exist_b (fn):
- try:
- f = open (fn)
- return 1
- except:
- return 0
+junk_prefix = 'out-www/'
headertext= r"""
-These example files are taken from the LilyPond distribution.
-LilyPond currently only outputs TeX and MIDI. The pictures and
-PostScript files were generated using TeX, Ghostscript and some
-graphics tools. The papersize used for these examples is A4.
-The images are in PNG format, and should be viewable with any current browser.
-We don't use GIFS due to <a href="http://www.gnu.org/philosophy/gif.html">patent problems</a>.
+
+<h1>LilyPond samples</h1>
+
+
+<p>You're looking at a page with some LilyPond samples. These files
+are also included in the distribution. The output is completely
+generated from the source file, without any further touch up.
+
<p>
-If you want an accurate impression of the output quality please <em>print
-out</em> the samples first.
-"""
-headertext_nopics = r"""This is a subdirectory of the LilyPond example
-set. We decided not to show any examples from this directory. If you
-want to view them, then you have to download LilyPond and compile them
-yourself."""
+The pictures are 90 dpi anti-aliased snapshots of the printed output.
+For a good impression of the quality print out the PDF file.
+"""
+headertext_nopics= r"""
+<p>No examples were found in this directory.
+"""
#
# FIXME breaks on multiple strings.
#
-def read_mudela_header (fn):
- s = gulp_file(fn)
- s = re.sub('%.*$', '', s)
- s = re.sub('\n', ' ', s)
-
- dict = {}
- m = re.search (r"""\\header\s*{([^}]*)}""", s)
-
- if m:
- s = m.group(1)
- else:
- return dict
-
- while s:
- m = re.search (r"""\s*(\S+)\s*=\s*([^;]+)\s*;""", s)
- if m == None:
- s = ''
- else:
- s = s[m.end (0):]
- left = m.group (1)
- right = m.group (2)
-
- left = re.sub ('"', '', left)
- right = re.sub ('"', '', right)
- dict[left] = right
-
- return dict
+def read_lilypond_header (fn):
+ s = open (fn).read ()
+ s = re.sub ('%.*$', '', s)
+ s = re.sub ('\n', ' ', s)
+
+ dict = {}
+ m = re.search (r"""\\header\s*{([^}]*)}""", s)
+
+ if m:
+ s = m.group (1)
+ else:
+ return dict
+
+ while s:
+ m = re.search (r'''\s*(\S+)\s*=\s*"([^"]+)"''', s)
+ if m == None:
+ s = ''
+ else:
+ s = s[m.end (0):]
+ left = m.group (1)
+ right = m.group (2)
+
+ left = re.sub ('"', '', left)
+ right = re.sub ('"', '', right)
+ dict[left] = right
+
+ return dict
def help ():
- sys.stdout.write (r"""Usage: mutopia-index [options] INFILE OUTFILE
-Generate index for mutopia\n
+ sys.stdout.write (r'''Usage: mutopia-index [OPTIONS] INFILE OUTFILE
+Generate index for mutopia.
+
Options:
- -h, --help print this help
- --prefix=PRE specify prefix
- -s, --subdirs=DIR add subdir
- --suffix=SUF specify suffix"""
- )
- sys.exit (0)
+ -h, --help print this help
+ -o, --output=FILE write output to file
+ -s, --subdirs=DIR add subdir
+ --suffix=SUF specify suffix
+
+''')
+ sys.exit (0)
# ugh.
-def gen_list(inputs, subdir, filename):
- (pre, subdirs, post)=subdir
- print "generating HTML list %s\n" % filename
- list = open(filename, 'w')
- list.write ('<html><TITLE>Rendered Examples</TITLE>\n')
- list.write ('<body bgcolor=white>')
- if subdirs:
- list.write ('<h2>subdirectories</h2>')
- list.write ('<ul>')
- for ex in subdirs:
- print 'subdir %s ' % ex
- list.write ('<li><a href=%s/index.html>Subdirectory: %s</a></li>\n' % (pre + ex + post , ex))
-
- list.write ('</ul>')
-
-
-
- if inputs:
- list.write('<h2>Contents of this directory</h2>\n');
-
- list.write (headertext)
- else:
- list.write (headertext_nopics)
-
-
- for ex in inputs:
- ex_ext = '.ly'
- print '%s, ' % ex
- try:
- header = read_mudela_header(ex + ex_ext + '.txt')
- except:
- ex_ext = '.fly'
- header = read_mudela_header(ex + ex_ext + '.txt')
-
- def read_dict(s, default, h =header):
- try:
- ret = h[s]
- except KeyError:
- ret = default
- return ret
- head = read_dict('title', ex)
- composer = read_dict('composer', '')
- desc = read_dict('description', '')
- list.write('<hr>')
- list.write('<h1>example file: %s</h1>' % head);
- if composer <> '':
- list.write('<h2>%s</h2>\n' % composer)
- if desc <> '':
- list.write('%s<p>' % desc)
- list.write ('<ul>')
- def list_item(filename, desc, type, l = list):
- if file_exist_b(filename):
- l.write ('<li><a href=%s>%s</a>' % (filename, desc))
- size=os.stat(filename)[stat.ST_SIZE]
- l.write (' (%s %dk)' % (type, (size + 512) / 1024))
- pictures = ['jpeg', 'png', 'xpm']
- l.write ('\n')
- list_item(ex + ex_ext + '.txt', 'The input', 'ASCII')
- for pageno in range(1,100):
- f = ex + '-page%d.png' % pageno
- if not file_exist_b (f):
- break
- list_item(f, 'The output, page %d' % pageno, 'png')
- list_item(ex + '.ps.gz', 'The output', 'gzipped PostScript')
- list_item(ex + '.midi', 'The output', 'MIDI')
- list.write ("</ul>");
-
- list.write( "</BODY></HTML>");
- list.close()
+def gen_list (inputs, file_name):
+ sys.stderr.write ("generating HTML list %s" % file_name)
+ sys.stderr.write ('\n')
+ if file_name:
+ list = open (file_name, 'w')
+ else:
+ list = sys.stdout
+ list.write ('''<html><head><title>Rendered Examples</title>
+<style type="text/css">
+hr { border:0; height:1; color: #000000; background-color: #000000; }\n
+</style>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+</head>''')
+
+ list.write ('<body bgcolor=white>\n')
+
+ if inputs:
+ list.write (headertext)
+ else:
+ list.write (headertext_nopics)
+
+ for ex in inputs:
+ print ex
+
+ (base, ext) = os.path.splitext (ex)
+ (base, ext2) = os.path.splitext (base)
+ ext = ext2 + ext
+
+ header = read_lilypond_header (ex)
+ def read_dict (s, default, h = header):
+ try:
+ ret = h[s]
+ except KeyError:
+ ret = default
+ return ret
+ head = read_dict ('title', os.path.basename (base))
+ composer = read_dict ('composer', '')
+ desc = read_dict ('description', '')
+ list.write ('<hr>\n')
+ list.write ('<h1>%s</h1>\n' % head);
+ if composer:
+ list.write ('<h2>%s</h2>\n' % composer)
+ if desc:
+ list.write ('%s<p>' % desc)
+ list.write ('<ul>\n')
+
+ def list_item (file_name, desc, type, lst = list):
+ if os.path.isfile (file_name):
+ lst.write ('<li><a href="%s">%s</a>'
+ % (re.sub (junk_prefix, '', file_name), desc))
+
+ # FIXME: include warning if it uses \include
+ # files.
+
+ size = os.stat (file_name)[stat.ST_SIZE]
+ kB = (size + 512) / 1024
+ if kB:
+ lst.write (' (%s %d kB)' % (type, kB))
+ else:
+ lst.write (' (%s %d characters)'
+ % (type, size))
+ pictures = ['jpeg', 'png', 'xpm']
+ lst.write ('\n')
+ else:
+ print "cannot find" , `file_name`
+
+ list_item (base + ext, 'The input', 'ASCII')
+
+ pages_found = 0
+ for page in range (1, 100):
+ f = base + '-page%d.png' % page
+
+ if not os.path.isfile (f):
+ break
+ pages_found += 1
+ list_item (f, 'See a picture of page %d' % page, 'png')
+
+ if pages_found == 0 and os.path.exists (base + '.png'):
+ list_item (base + ".png",
+ 'See a picture', 'png')
+
+
+ list_item (base + '.pdf', 'Print', 'PDF')
+ list_item (base + '.midi', 'Listen', 'MIDI')
+ list.write ('</ul>\n');
+
+ list.write ('</body></html>\n');
+ list.close ()
+
+(options, files) = getopt.getopt (sys.argv[1:],
+ 'ho:', ['help', 'output='])
+outfile = 'examples.html'
+
+subdirs = []
+for opt in options:
+ o = opt[0]
+ a = opt[1]
+ if o == '--help' or o == '-h':
+ help ()
+ elif o == '--output' or o == '-o':
+ outfile = a
-import getopt
+dirs = []
+for f in files:
+ dirs = dirs + find ('out-www', f)
-(options, files) = getopt.getopt(sys.argv[1:],
- 'hp:s:', ['help', 'subdirs=', 'suffix=', 'prefix='])
-subdir_pre=''
-subdir_suf =''
+if not dirs:
+ dirs = ['.']
-subdirs =[]
-for opt in options:
- o = opt[0]
- a = opt[1]
- if o == '--subdirs' or o == '-s':
- subdirs.append (a)
- elif o == '--prefix':
- subdir_pre = a
- elif o == '--suffix':
- subdir_suf = a
-
-
-allfiles = find.find ('*.ly') + find.find ('*.ly.txt')
-
-gen_list (files, (subdir_pre, subdirs, subdir_suf), 'index.html')
+allfiles = []
+
+for d in dirs:
+ allfiles = allfiles + find ('*.ly', d)
+
+allfiles = filter (lambda x: not x.endswith ('snippet-map.ly') and not re.search ('lily-[0-9a-f]+', x), allfiles)
+
+gen_list (allfiles, outfile)