aboutsummaryrefslogtreecommitdiffstats
path: root/lv2specgen
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2012-04-06 18:37:43 +0000
committerDavid Robillard <d@drobilla.net>2012-04-06 18:37:43 +0000
commitf9ca8aa64fcad5b50bc7a56d2c72b78ce356eef2 (patch)
tree4d0993f534beca88f1cc71f532c23c45887f993a /lv2specgen
parenta15aa51fbdd310d582b4088bd9503c400269ad98 (diff)
downloadlv2-f9ca8aa64fcad5b50bc7a56d2c72b78ce356eef2.tar.xz
Add preliminary lv2docgen.py script.
Diffstat (limited to 'lv2specgen')
-rwxr-xr-xlv2specgen/lv2docgen.py141
1 files changed, 141 insertions, 0 deletions
diff --git a/lv2specgen/lv2docgen.py b/lv2specgen/lv2docgen.py
new file mode 100755
index 0000000..423659e
--- /dev/null
+++ b/lv2specgen/lv2docgen.py
@@ -0,0 +1,141 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# lv2docgen, a documentation generator for LV2 plugins
+# Copyright 2012 David Robillard <d@drobilla.net>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+__date__ = '2012-03-27'
+__version__ = '0.0.0'
+__authors__ = 'David Robillard'
+__license__ = 'ISC License <http://www.opensource.org/licenses/isc>'
+__contact__ = 'devel@lists.lv2plug.in'
+
+import errno
+import os
+import sys
+
+try:
+ import rdflib
+except ImportError:
+ sys.exit('Error importing rdflib')
+
+doap = rdflib.Namespace('http://usefulinc.com/ns/doap#')
+lv2 = rdflib.Namespace('http://lv2plug.in/ns/lv2core#')
+rdf = rdflib.Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#')
+rdfs = rdflib.Namespace('http://www.w3.org/2000/01/rdf-schema#')
+
+def uri_to_path(uri):
+ path = uri[uri.find(':'):]
+ while not path[0].isalpha():
+ path = path[1:]
+ return path
+
+def get_doc(model, subject):
+ comment = model.value(subject, rdfs.comment, None)
+ if comment:
+ return '<p class="content">%s</p>' % comment
+ return ''
+
+def port_doc(model, port):
+ name = model.value(port, lv2.name, None)
+ comment = model.value(port, rdfs.comment, None)
+ html = '<div class="specterm"><h3>%s</h3>' % name
+ html += get_doc(model, port)
+ html += '</div>'
+ return html
+
+def plugin_doc(model, plugin, style_uri):
+ uri = str(plugin)
+ name = model.value(plugin, doap.name, None)
+
+ html = '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
+<html about="%s"
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+ xmlns:lv2="http://lv2plug.in/ns/lv2core#"
+ xml:lang="en">''' % uri
+
+ html += '''<head>
+ <title>%s</title>
+ <meta http-equiv="content-type" content="text/xhtml+xml; charset=utf-8" />
+ <meta name="generator" content="lv2docgen" />
+ <link href="%s" rel="stylesheet" type="text/css" />
+ </head>
+ <body>''' % (name, style_uri)
+
+ html += '''
+ <!-- HEADER -->
+ <div id="header">
+ <h1 id="title">%s</h1>
+ <table id="meta">
+ <tr><th>URI</th><td><a href="%s">%s</a></td></tr>
+ <tr><th>Version</th><td>%s</td></tr>
+ </table>
+ </div>
+''' % (name, uri, uri, '0.0.0')
+
+ html += get_doc(model, plugin)
+
+ ports_html = ''
+ for p in model.triples([plugin, lv2.port, None]):
+ ports_html += port_doc(model, p[2])
+
+ if len(ports_html):
+ html += '''
+ <h2 class="sec">Ports</h2>
+ <div class="content">
+%s
+ </div>''' % ports_html
+
+ html += ' </body></html>'
+ return html
+
+if __name__ == '__main__':
+ 'LV2 plugin documentation generator'
+
+ if len(sys.argv) < 2:
+ print('Usage: %s OUTDIR FILE...' % sys.argv[0])
+ sys.exit(1)
+
+ outdir = sys.argv[1]
+ files = sys.argv[2:]
+ model = rdflib.ConjunctiveGraph()
+ for f in files:
+ model.parse(f, format='n3')
+
+ style_uri = os.path.abspath(os.path.join(outdir, 'style.css'))
+ for p in model.triples([None, rdf.type, lv2.Plugin]):
+ plugin = p[0]
+ html = plugin_doc(model, plugin, style_uri)
+ path = uri_to_path(plugin)
+
+ outpath = os.path.join(outdir, path + '.html')
+ try:
+ os.makedirs(os.path.dirname(outpath))
+ except OSError:
+ e = sys.exc_info()[1]
+ if e.errno == errno.EEXIST:
+ pass
+ else:
+ raise
+
+ print 'Writing <%s> documentation to %s' % (plugin, outpath)
+ out = open(outpath, 'w')
+ out.write(html)
+ out.close()
+
+
+