Developing Webware
++++++++++++++++++

This document should outline the details you need to understand
Webware and WebKit internals, and assist in becoming a more advanced
Webware programmer.


Style Guidelines
================

Webware developers are requested to observe the rules defined
in the `Webware Style Guidelines`__.

__ ../../Docs/StyleGuidelines.html


Creating Plugins
================

Each plugin is a Python Package.  WebKit finds plugins using the
``PlugIns`` and ``PluginDirs`` -- see Configuration__.  See also the
`Python tutorial on packages`__ and the ``PlugIn.py`` doc string.

__ Configuration.html#appserver-config
__ http://www.python.org/doc/current/tut/node8.html#SECTION008400000000000000000

A plug-in must have ``__init__.py`` and ``Properties.py`` files.
You can disable a specific plug-in by placing a ``dontload`` file in it.

``__init.py__`` must contain a function like::

    def InstallInWebKit(appServer):
        pass

The function doesn't need to do anything, but this gives it the
opportunity to do something with the AppServer -- for instance, the
PSP plugin uses AppServer.addServletFactory to add a handler for ``.psp``
files.

The ``Properties.py`` file should contain a number of assignments::

    name = "Plugin name"
    version = (1, 0, 0)
    docs = [{'name': 'Quick Start Guide', 'file': 'QuickStart.html'},
            {'name': 'Reference Guide, 'file': 'Reference.html'}]
    status = 'beta'
    requiredPyVersion = (2, 6, 0)
    requiredOpSys = 'posix'
    synopsis = """A paragraph-long description of the plugin"""
    WebKitConfig = {
        'examplePages': [
            'Example1',
            'ComplexExample',
            ]
        }
    def willRunFunc():
        if softwareNotInstalled:
            return "some message to that effect"
        else:
            return None

The documents (e.g. ``QuickStart.html``) should be located in a ``Docs/``
subdirectory.  The example pages go in an ``Examples/`` subdirectory.

A plugin who's ``requiredPyVersion`` or ``requiredOpSys`` aren't satisfied will
simply be ignored.  ``requiredOpSys`` should be something returned by
``os.name``, like ``posix`` or ``nt``.  Or you can define a function
``willRunFunc`` to test.  If there aren't requirements you can leave these
variables and functions out.
