#!/usr/bin/env python
import os
import shutil
import subprocess
import glob
import re
import datetime
import xml.dom.minidom
import xml.dom
out_base = os.path.join('build', 'ns')
try:
shutil.rmtree(out_base)
except:
pass
os.makedirs(out_base)
URIPREFIX = 'http://lv2plug.in/ns/'
DOXPREFIX = 'ns/doc/html/'
SPECGENDIR = './specgen'
STYLEURI = os.path.join('aux', 'style.css')
TAGFILE = './doclinks'
# release_dir = os.path.join('build', 'spec')
# try:
# os.mkdir(release_dir)
# except:
# pass
devnull = open(os.devnull, 'w')
# 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)
# Rescue Doxygen tag file from XML hell
# Return the content of the first child node with a certain tag name
def getChildText(elt, tagname):
elements = elt.getElementsByTagName(tagname)
text = ''
for e in elements:
if e.parentNode == elt:
text = e.firstChild.nodeValue
return text
return text
tagdoc = xml.dom.minidom.parse('c_tags')
root = tagdoc.documentElement
bettertags = open(TAGFILE, 'w')
for cn in root.childNodes:
if cn.nodeType == xml.dom.Node.ELEMENT_NODE and cn.tagName == 'compound':
if cn.getAttribute('kind') == 'page':
continue
name = getChildText(cn, 'name')
filename = getChildText(cn, 'filename')
# Sometimes the .html is there, sometimes it isn't...
if filename[-5:] != '.html':
filename += '.html'
bettertags.write('%s %s%s\n' % (name, DOXPREFIX, filename))
if cn.getAttribute('kind') == 'file':
prefix = ''
else:
prefix = name + '::'
members = cn.getElementsByTagName('member')
for m in members:
mname = prefix + getChildText(m, 'name')
mafile = getChildText(m, 'anchorfile')
manchor = getChildText(m, 'anchor')
bettertags.write('%s %s%s#%s\n' % (mname, DOXPREFIX, \
mafile, manchor))
bettertags.close()
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)
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'),
STYLEURI,
os.path.join(out_base, html_filename),
os.path.join('..', '..'),
TAGFILE,
'-i'])
gendoc('./lv2specgen', 'core.lv2', 'lv2.ttl', 'lv2core/lv2core.html')
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')
index_html = """
LV2 Extensions
LV2 Extensions
""" + URIPREFIX + dir + "/
\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:
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:
PREFIX 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'
minor = '0'
micro = '0'
match = re.search('([^\.]*)\.([^\.]*)', rev)
if match:
minor = match.group(1)
micro = match.group(2)
# if rev != '0' and rev.find('pre') == -1:
# path = os.path.join(os.path.abspath(release_dir), 'lv2-%s-%s.tar.gz' % (b, rev))
# subprocess.call(['tar', '--exclude-vcs', '-czf', path,
# bundle[bundle.find('/') + 1:]], cwd=dir)
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',
STYLEURI,
'%s.lv2/%s.html' % (b, b),
os.path.join('..', '..', '..'),
os.path.join('..', '..', '..', TAGFILE),
'-i'], cwd=outdir);
li = '
'
if minor == '0' or (int(micro) % 2) != 0:
li += 'Experimental: '
li += '%s' % (b, b)
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 += '