diff --git a/tools/generate-plugin-documentation.py b/tools/generate-plugin-documentation.py
index 7cf9b4446..4a5461b6c 100755
--- a/tools/generate-plugin-documentation.py
+++ b/tools/generate-plugin-documentation.py
@@ -47,87 +47,183 @@ conf.logDir = 'test-log'
import debug
import callbacks
+commandDict = {}
-def makePluginDocumentation(filename):
- print 'Generating documentation for %s' % filename
- trClasses = { 'treven':'trodd', 'trodd':'treven' }
- trClass = 'treven'
- pluginName = filename.split('.')[0]
- moduleInfo = imp.find_module(pluginName, conf.pluginDirs)
- module = imp.load_module(pluginName, *moduleInfo)
+def prepIndex():
directory = os.path.join('docs', 'plugins')
if not os.path.exists(directory):
os.mkdir(directory)
- if not hasattr(module, 'Class'):
- print '%s is not a plugin.' % filename
- return
- try:
- plugin = module.Class()
- except Exception, e:
- print '%s could not be loaded: %s' % (filename, debug.exnToString(e))
- return
- if isinstance(plugin, callbacks.Privmsg) and not \
- isinstance(plugin, callbacks.PrivmsgRegexp):
- fd = file(os.path.join(directory,'%s.html' % pluginName), 'w')
- fd.write(textwrap.dedent("""
-
-
-
-
- Documentation for the %s plugin for Supybot
-
-
-
%s
-
- """) % (pluginName, cgi.escape(module.__doc__ or "")))
- for attr in dir(plugin):
- if plugin.isCommand(attr):
- method = getattr(plugin, attr)
- if hasattr(method, '__doc__'):
- doclines = method.__doc__.splitlines()
- help = doclines.pop(0)
- morehelp = 'This command has no detailed help.'
- if doclines:
- doclines = filter(None, doclines)
- doclines = map(str.strip, doclines)
- morehelp = ' '.join(doclines)
- help = cgi.escape(help)
- morehelp = cgi.escape(morehelp)
- trClass = trClasses[trClass]
- fd.write(textwrap.dedent("""
- %s | %s | %s
- |
- """) % (trClass, attr, help, morehelp))
- fd.write(textwrap.dedent("""
-
- """))
- if hasattr(module, 'example'):
- s = module.example.encode('string-escape')
- s = s.replace('\\n', '\n')
- s = s.replace("\\'", "'")
- fd.write(textwrap.dedent("""
-
Here's an example session with this plugin:
-
- %s
-
- """) % cgi.escape(s))
- fd.write(textwrap.dedent("""
-
-
-
- """))
- fd.close()
+ fd = file(os.path.join(directory, 'index.html'), 'w')
+ fd.write(textwrap.dedent("""
+
+
+
+
+ Supybot plugin documentation
+
+
+
Supybot Plugin Documentation Index
+
Plugin (Command list)
+ """))
+ fd.close()
-if __name__ == '__main__':
+def makePluginDocumentation(pluginWindow):
+ global commandDict
+ trClasses = { 'treven':'trodd', 'trodd':'treven' }
+ trClass = 'treven'
+ (pluginName, module, plugin) = pluginWindow[1]
+ print 'Generating documentation for %s.py' % pluginName
+ prev = pluginWindow[0][0] or 'index'
+ next = pluginWindow[2][0] or 'index'
+ directory = os.path.join('docs', 'plugins')
+ if not os.path.exists(directory):
+ os.mkdir(directory)
+ id = file(os.path.join(directory, 'index.html'), 'a')
+ id.write(textwrap.dedent("""
+
%s
+ """ % (pluginName, pluginName.capitalize())))
+ fd = file(os.path.join(directory,'%s.html' % pluginName), 'w')
+ fd.write(textwrap.dedent("""
+
+
+
+
+
Documentation for the %s plugin for Supybot
+
+
+
+
+
+
%s
+
+ """) % (pluginName, next, prev, cgi.escape(module.__doc__ or "")))
+ attrs = [x for x in dir(plugin) if plugin.isCommand(x) and not
+ x.startswith('_')]
+ id.write('(%s)
\n' % ', '.join(attrs))
+ for attr in attrs:
+ if attr in commandDict:
+ commandDict[attr].append(pluginName)
+ else:
+ commandDict[attr] = [pluginName]
+ method = getattr(plugin, attr)
+ if hasattr(method, '__doc__'):
+ doclines = method.__doc__.splitlines()
+ help = doclines.pop(0)
+ morehelp = 'This command has no detailed help.'
+ if doclines:
+ doclines = filter(None, doclines)
+ doclines = map(str.strip, doclines)
+ morehelp = ' '.join(doclines)
+ help = cgi.escape(help)
+ morehelp = cgi.escape(morehelp)
+ trClass = trClasses[trClass]
+ fd.write(textwrap.dedent("""
+ %s | %s | %s
+ |
+ """) % (trClass, attr, help, morehelp))
+ fd.write(textwrap.dedent("""
+
+ """))
+ if hasattr(module, 'example'):
+ s = module.example.encode('string-escape')
+ s = s.replace('\\n', '\n')
+ s = s.replace("\\'", "'")
+ fd.write(textwrap.dedent("""
+
Here's an example session with this plugin:
+
+ %s
+
+ """) % cgi.escape(s))
+ fd.write(textwrap.dedent("""
+
+
+
+
+ """ % (prev, prev.capitalize(), next, next.capitalize())))
+ fd.close()
+ id.close()
+
+def finishIndex():
+ directory = os.path.join('docs', 'plugins')
+ if not os.path.exists(directory):
+ os.mkdir(directory)
+ fd = file(os.path.join(directory, 'index.html'), 'a')
+ fd.write(textwrap.dedent("""
+
+
+
+ """))
+ fd.close()
+
+def makeCommandsIndex():
+ global commandDict
+ directory = os.path.join('docs', 'plugins')
+ if not os.path.exists(directory):
+ os.mkdir(directory)
+ fd = file(os.path.join(directory, 'commands.html'), 'w')
+ fd.write(textwrap.dedent("""
+
+
+
+
+ Supybot Commands Index
+
+
+
Supybot Commands Index
+
Command (Plugins)
+ """))
+ commands = [c for c in commandDict.iterkeys()]
+ commands.sort()
+ for command in commands:
+ plugins = commandDict[command]
+ plugins.sort()
+ fd.write('
%s (%s)
\n' % (command,
+ ', '.join(['
%s' % (p, p)
+ for p in plugins])))
+ fd.write(textwrap.dedent("""
+
+
+
+ """))
+ fd.close()
+
+def genPlugins():
for directory in conf.pluginDirs:
for filename in os.listdir(directory):
if filename.endswith('.py') and filename[0].isupper():
- makePluginDocumentation(filename)
+ pluginName = filename.split('.')[0]
+ moduleInfo = imp.find_module(pluginName, conf.pluginDirs)
+ module = imp.load_module(pluginName, *moduleInfo)
+ if not hasattr(module, 'Class'):
+ print '%s is not a plugin.' % filename
+ continue
+ try:
+ plugin = module.Class()
+ except Exception, e:
+ print '%s could not be loaded: %s' % (filename,
+ debug.exnToString(e))
+ continue
+ if isinstance(plugin, callbacks.Privmsg) and not \
+ isinstance(plugin, callbacks.PrivmsgRegexp):
+ yield (pluginName, module, plugin)
+
+if __name__ == '__main__':
+ prepIndex()
+ plugins = [p for p in genPlugins()]
+ plugins.sort()
+ plugins = [(None,)] + plugins + [(None,)]
+ for pluginWindow in window(plugins, 3):
+ makePluginDocumentation(pluginWindow)
+ finishIndex()
+ makeCommandsIndex()
-
-
-
# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: