diff options
Diffstat (limited to 'gendoc.py')
-rwxr-xr-x | gendoc.py | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/gendoc.py b/gendoc.py new file mode 100755 index 0000000..eca6c35 --- /dev/null +++ b/gendoc.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python + +import os +import shutil +import subprocess +import glob +import re +import datetime + +out_base = os.path.join('build', 'default', 'doc') + +try: + shutil.rmtree(out_base) +except: + pass + +os.makedirs(out_base) + +URIPREFIX = 'http://lv2plug.in/ns/' +SPECGENDIR = './specgen' + +print '** Generating core documentation' + +lv2_outdir = os.path.join(out_base, 'lv2core') +os.mkdir(lv2_outdir) +shutil.copy('core.lv2/lv2.h', lv2_outdir) +shutil.copy('core.lv2/lv2.ttl', lv2_outdir) +shutil.copy('core.lv2/manifest.ttl', lv2_outdir) +shutil.copy('doc/index.php', lv2_outdir) + +devnull = open(os.devnull, 'w') + +def gendoc(specgen_dir, bundle_dir, ttl_filename, html_filename): + subprocess.call([os.path.join(specgen_dir, 'lv2specgen.py'), + os.path.join(bundle_dir, ttl_filename), + os.path.join(specgen_dir, 'template.html'), + os.path.join(specgen_dir, 'style.css'), + os.path.join(out_base, html_filename), + os.path.join('..', 'doc'), + '-i']) + +gendoc('./lv2specgen', 'core.lv2', 'lv2.ttl', 'lv2core/lv2core.html') + +style = open('./lv2specgen/style.css', 'r') +footer = open('./lv2specgen/footer.html', 'r') + +# Generate main (ontology) documentation and indices +for dir in ['ext', 'extensions']: + print "** Generating %s%s documentation" % (URIPREFIX, dir) + + outdir = os.path.join(out_base, dir) + + shutil.copytree(dir, outdir, ignore = lambda src, names: '.svn') + os.mkdir(os.path.join(outdir, 'releases')) + + index_html = """<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="application/xhtml+xml;charset=utf-8"/> +<title>LV2 Extensions</title> +<style type="text/css"> +""" + + index_html += style.read() + + index_html += """ +</style></head> +<body><h1>LV2 Extensions</h1> +<h2>""" + URIPREFIX + dir + "/</h2><ul>\n" + + extensions = [] + + for bundle in glob.glob(os.path.join(dir, '*.lv2')): + b = bundle.replace('.lv2', '') + b = b[b.find('/') + 1:] + + # Get extension URI + ext = subprocess.Popen(['roqet', '-q', '-e', """ +PREFIX lv2: <http://lv2plug.in/ns/lv2core#> +SELECT ?ext FROM <%s.lv2/%s.ttl> WHERE { ?ext a lv2:Specification } +""" % (os.path.join(dir, b), b)], stdout=subprocess.PIPE).communicate()[0] + + if ext == "": + continue + + ext = re.sub('^result: \[ext=uri<', '', ext) + ext = re.sub('>\]$', '', ext).strip() + + # Get revision + query = """ +PREFIX lv2: <http://lv2plug.in/ns/lv2core#> +PREFIX doap: <http://usefulinc.com/ns/doap#> +SELECT ?rev FROM <%s.lv2/%s.ttl> WHERE { <%s> doap:release [ doap:revision ?rev ] } +""" % (os.path.join(dir, b), b, ext) + + rev = subprocess.Popen(['roqet', '-q', '-e', query], + stdout=subprocess.PIPE).communicate()[0] + + if rev != '': + rev = re.sub('^result: \[rev=string\("', '', rev) + rev = re.sub('"\)\]$', '', rev).strip() + else: + rev = '0' + + subprocess.call(['tar', '-czf', outdir + '/releases/%s.lv2-%s.tgz' % (b, rev), + outdir + '/%s.lv2' % b]) + + specgendir = '../../../../lv2specgen/' + if (os.access(outdir + '/%s.lv2/%s.ttl' % (b, b), os.R_OK)): + print ' * Calling lv2specgen for %s%s/%s' %(URIPREFIX, dir, b) + subprocess.call([specgendir + 'lv2specgen.py', + '%s.lv2/%s.ttl' % (b, b), + specgendir + 'template.html', + specgendir + 'style.css', + '%s.lv2/%s.html' % (b, b), + os.path.join('..', '..', 'doc'), + '-i'], cwd=outdir); + + li = '<li>' + if rev == '0': + li += '<span style="color: red;">Experimental: </span>' + li += '<a rel="rdfs:seeAlso" href="%s">%s</a>' % (b, b) + li += '</li>' + + extensions.append(li) + + shutil.copy('doc/index.php', os.path.join(outdir, b + '.lv2', 'index.php')) + + # Remove .lv2 suffix from bundle name (to make URI resolvable) + os.rename(outdir + '/%s.lv2' % b, outdir + '/%s' % b) + + extensions.sort() + for i in extensions: + index_html += i + '\n' + + index_html += '</ul>\n' + index_html += '<div class="content"><a href="./releases">Releases</a></div>\n' + + index_html += '<div class="footer">' + index_html += '<span class="footer-text">Generated on ' + index_html += datetime.datetime.utcnow().strftime('%F %H:%M UTC') + index_html += ' by LV2 gendoc.py</span>' + index_html += footer.read() + '</div>' + + index_html += '</body></html>\n' + + index_file = open(os.path.join(outdir, 'index.html'), 'w') + print >>index_file, index_html + index_file.close() + +# Generate code (headers) documentation +print "** Generating header documentation" +#shutil.copy('Doxyfile', os.path.join('upload', 'Doxyfile')) +print ' * Calling doxygen in ' + os.getcwd() +subprocess.call('doxygen', stdout=devnull) + +devnull.close() +style.close() +footer.close() |