mirror of
https://github.com/microtherion/VocalEasel.git
synced 2024-12-22 19:23:59 +00:00
287 lines
8.5 KiB
Python
Executable File
287 lines
8.5 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
# Parse libraries and create html docs
|
|
|
|
import os, sys, time, platform, subprocess
|
|
|
|
if len(sys.argv)>1:
|
|
print """mma-libdoc is a MMA maintenance program to parse library
|
|
files and create/maintain the html library documentation.
|
|
This program should be run as 'root' and it takes no
|
|
command options. For more details see the file
|
|
"README.mma-libdoc" which is distributed with MMA."""
|
|
sys.exit(0)
|
|
|
|
installdir = ( "c:\\mma\\", "/usr/local/share/mma", "/usr/share/mma", ".")
|
|
|
|
libpath = ''
|
|
docpath = ''
|
|
|
|
for p in installdir:
|
|
a = os.path.join(p, 'lib', '')
|
|
if os.path.isdir(a):
|
|
libpath=a
|
|
docpath = os.path.join(p, 'docs', 'html', 'lib')
|
|
break
|
|
|
|
if not libpath:
|
|
print "Can't find the MMA library!"
|
|
print "Please check your installation and/or change the search path in this program."
|
|
sys.exit(1)
|
|
|
|
try:
|
|
os.mkdir(docpath)
|
|
except:
|
|
pass
|
|
|
|
index = []
|
|
links = []
|
|
|
|
MMA = "mma" # set different path to mma if you need to
|
|
|
|
if platform == "Windows":
|
|
sh_value = True
|
|
else:
|
|
sh_value = False
|
|
|
|
|
|
print "Processing library files"
|
|
|
|
def dodir(dir):
|
|
""" Process files in directory. """
|
|
|
|
global index, links
|
|
newdirs = []
|
|
|
|
olib = os.path.join(docpath, dir)
|
|
if not os.path.isdir(olib):
|
|
try:
|
|
os.mkdir(olib)
|
|
except:
|
|
print "Can't create directory", olib
|
|
sys.exit(1)
|
|
|
|
links.append("<li> <A Href=#%s> <h2> %s </h2> </a> </li>" % (dir, dir.title()))
|
|
|
|
if dir.lower() == "stdlib":
|
|
index.append("<P><h3>These grooves can be used from a program just by using their name.</h3>")
|
|
|
|
index.append("<A Name =%s></a>" % dir)
|
|
index.append("<h2> %s </h2>" % dir.title() )
|
|
|
|
index.append("<ul>")
|
|
|
|
|
|
for f in sorted(os.listdir(libpath + dir)):
|
|
this = os.path.join(libpath, dir, f)
|
|
|
|
if os.path.isdir(this):
|
|
newdirs.append(os.path.join(dir, f))
|
|
continue
|
|
|
|
if this.endswith('.mma'):
|
|
htmlfname = os.path.join(dir, f.replace('.mma' , '.html'))
|
|
htmldate = 0
|
|
htmlout = os.path.join(docpath, htmlfname)
|
|
try:
|
|
htmldate = os.path.getmtime(htmlout)
|
|
except:
|
|
pass
|
|
|
|
libdate = 0
|
|
try:
|
|
libdate = os.path.getmtime(this)
|
|
except:
|
|
print "NO, NO, NO --- let Bob know about this!"
|
|
pass # shouldn't ever happen!
|
|
|
|
if libdate < htmldate:
|
|
print "Skipping:", this
|
|
|
|
else:
|
|
if htmldate == 0:
|
|
print "Creating:", htmlfname
|
|
else:
|
|
print "Updating:", htmlfname
|
|
try:
|
|
pid = subprocess.Popen( [MMA, "-Dxh", "-w", "-n", this],
|
|
shell=sh_value, stdout=subprocess.PIPE)
|
|
output = pid.communicate()[0]
|
|
except:
|
|
print "Error forking %s. Is MMA variable correctly set?" % MMA
|
|
sys.exit(1)
|
|
|
|
try:
|
|
o = open(htmlout, "w")
|
|
o.write(output)
|
|
o.close()
|
|
except:
|
|
print "ERROR Creating %s" % htmlout
|
|
continue
|
|
|
|
|
|
# Now make html files for each groove in the lib file.
|
|
|
|
for a in file(htmlout):
|
|
if a.startswith("<!-- GROOVE"):
|
|
a=a.split()
|
|
gname = a[1].split('=', 1)[1]
|
|
gout = os.path.join(docpath, dir, a[2].split('=', 1)[1])
|
|
srcfile = a[3].split('=', 1)[1]
|
|
|
|
try:
|
|
pid = subprocess.Popen( [MMA, "-Dgh", "-w", "-n",
|
|
"%s/%s" % (srcfile, gname)],
|
|
shell=sh_value, stdout=subprocess.PIPE)
|
|
output = pid.communicate()[0]
|
|
except:
|
|
print "Error forking %s. Is MMA variable correctly set?"
|
|
sys.exit(1)
|
|
|
|
try:
|
|
o = open(gout, "w")
|
|
o.write(output)
|
|
o.close()
|
|
except:
|
|
print "ERROR Creating %s" % gout
|
|
continue
|
|
|
|
|
|
index.append("<li> <A Href = %s> %s </a> </li>" % \
|
|
(htmlfname, os.path.join(dir, f)))
|
|
|
|
index.append("</ul>")
|
|
|
|
if dir.lower() == "stdlib":
|
|
index.append('<P><h3>These groove should be callable just by using their names. If you have problems with duplicate groove names you can always force their use with a "use" directive.</h3>')
|
|
|
|
for d in newdirs:
|
|
dodir(d)
|
|
|
|
##############################
|
|
|
|
|
|
a = os.listdir(libpath)
|
|
dirs = []
|
|
|
|
for b in a:
|
|
if os.path.isdir(libpath + b):
|
|
dirs.append(b)
|
|
dirs.sort()
|
|
|
|
if dirs.count("stdlib"):
|
|
dirs.remove("stdlib")
|
|
dirs.insert(0, "stdlib")
|
|
|
|
|
|
for dir in dirs:
|
|
dodir(dir)
|
|
|
|
out = file(os.path.join(docpath, 'index.html'), "w")
|
|
|
|
out.write("""<HTML>
|
|
|
|
<!-- Autogenerated by mma-libdoc. Do not edit ... you'll lose it! -->
|
|
|
|
<Center> <h1> The MMA Library </h1> </Center>
|
|
|
|
<P>
|
|
This document is provided as a supplement to the <em>MMA Reference
|
|
Manual</em> which lists all of the commands in the program and helpful
|
|
information which can be used to create your own "style" files. If you are a
|
|
newcomer to MMA, you
|
|
should also have a look at the <em>MMA Tutorial</em> for some "getting
|
|
started" information.
|
|
|
|
<P>
|
|
The information on these HTML pages has been generated directly
|
|
from the library files in your MMA library. Each
|
|
entry uses the filename as a header and then lists the various
|
|
defined grooves. In addition, the individual groove names are
|
|
clickable and will display further, detailed information on that groove.
|
|
<P>
|
|
You should be able to use any of the grooves listed in the "STDLIB"
|
|
section in your files without
|
|
using other directives. However, if you have files in other
|
|
locations you will need to need to
|
|
explicitly load the library file(s) with a <em>Use</em> directive.
|
|
|
|
<P>
|
|
The filenames are in all lowercase. These are the actual filenames
|
|
used in the library. If you are loading files with the <em>Use</em>
|
|
directive you must use the same case (please note that
|
|
typographic case applies only to the filename---this is operating system
|
|
dependant). <em>Groove</em> commands are case-insensitive.
|
|
|
|
<P>
|
|
Following each groove description is a boxed number in the form
|
|
<B>(4)</B>. This indicates the sequence size of the groove. Next, is
|
|
a list of tracks and instrument names. This shows the first voice or
|
|
drum note defined for each track---it is quite possible that the track
|
|
uses other voices. This data is included so that you can see what
|
|
tracks are active.
|
|
|
|
<P>
|
|
The library files supplied with MMA contain embedded documentation.
|
|
The <em>-Dxh</em> and <em>-Dxl</em> MMA command line options extract the following
|
|
information from the each library file:
|
|
|
|
<UL>
|
|
<LI> The filename from the "Doc File" directive.
|
|
|
|
<LI> The file description from the "Doc Note" directive.
|
|
|
|
<LI> Any user variables documented in "DocVar" directives.
|
|
|
|
<LI> Each groove description: This is the optional text following a
|
|
<em>DefGroove</em> directive.
|
|
|
|
<UL>
|
|
<LI> The sequence size. This is extracted from the current groove
|
|
information and was set with the <em>SeqSize</em> directive. It is
|
|
displayed in a small box after the groove description.
|
|
|
|
<LI> A "summary" of the voices used in the groove. Note that a
|
|
different voice or MIDI note is possible for each bar in the
|
|
sequence size; however, this listing only lists the selection for
|
|
the first bar.
|
|
|
|
</UL>
|
|
</UL>
|
|
|
|
<P>In addition, the <em>-Dgh</em> command generates sequence graphs and
|
|
detailed settings for each groove.
|
|
|
|
<P>If you find that you don't have some of the grooves listed below
|
|
in your distribution you need to run the program <em>mma-libdoc</em>
|
|
to update these docs. Not all style files are distributed in the
|
|
default MMA distribution.
|
|
|
|
<HR Size=3pt>
|
|
<CENTER> <H2> Index </H2> </CENTER>
|
|
|
|
""")
|
|
|
|
if links:
|
|
out.write("<ul>")
|
|
out.write("\n".join(links))
|
|
out.write("</ul>")
|
|
out.write("<HR Size=3pt>")
|
|
out.write( "\n".join(index))
|
|
|
|
out.write("""
|
|
<BR>
|
|
<HR Size=3pt>
|
|
<P> This document and the files linked were created by <em>mma-libdoc</em>.
|
|
|
|
<P>It is a part of the MMA distribution
|
|
and is protected by the same copyrights as MMA (the GNU General Public License).
|
|
|
|
<P> Created: %s""" % time.ctime() )
|
|
|
|
out.write("<HTML>")
|
|
|
|
|
|
out.close()
|
|
|