# about:python, originally by Alex Badea from xpcom import components, verbose import sys, os import platform def getAbout(): # Generate it each time so its always up-to-date. # Sort to keep things purdy mod_names = sys.modules.keys() mod_names.sort() env = os.environ.items() env.sort() return """ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>about:python</title> </head> <body> <h1>about:python</h1> <p> </p> <p>Python %(version)s on %(platform)s</p> <h2>resources</h2> <p>Visit the <a href="http://developer.mozilla.org/en/docs/PyXPCOM">pyxpcom wiki.</a></p> <h2>sys.path</h2><p>%(path)s</p><p> </p> <h2>environment</h2><p>%(environment)s</p><p> </p> <h2>modules</h2><p>%(modules)s</p><p> </p> </body> </html> """ % { 'version': sys.version, 'platform': platform.platform(), 'path': "<br>".join(sys.path), 'environment': "<br>".join(["%s=%s" % (n,v) for n, v in env]), 'modules': ", ".join(mod_names), } class AboutPython: _com_interfaces_ = components.interfaces.nsIAboutModule _reg_contractid_ = '@mozilla.org/network/protocol/about;1?what=python' _reg_clsid_ = '{6d5d462e-6de7-4bca-bbc6-c488d481351b}' _reg_desc_ = "about:python handler" def __init__(self): pass def newChannel(self, aURI): ioService = components.classes["@mozilla.org/network/io-service;1"] \ .getService(); istream = components.classes["@mozilla.org/io/string-input-stream;1"] \ .createInstance() about = getAbout() istream.setData(about, len(about)) channel = components.classes["@mozilla.org/network/input-stream-channel;1"] \ .createInstance(components.interfaces.nsIInputStreamChannel) channel.setURI(aURI) #channel.contentType = "text/html" channel.contentStream = istream return channel def getURIFlags(self, aURI): return 0;