Source

python-fu-dump / dump.py

Full commit
from gimpfu import *
from string import Template
import gtk
import os
import collections
import ctypes
import unicodedata
import re
import pprint

PROC_CSS = """html, body
{
        width:100%;
        height:100%;
        margin:0px;
}

body
{
        width:578px;
        margin:0px auto 0px 36px;
}

p, table
{
        margin:0px 0px 0px 12px;
}

nav
{
        display:block;
        margin-bottom:6px;
        text-align:center;
}

h1, h4
{
        margin-bottom:0px;
}

div#author
{
        text-align:right;
        font-style:italic;
}

span.date
{
        font:bold 14px Monospace,small-caps;
}

table
{
        font-family:'Trebuchet MS', Arial, Helvetica, sans-serif;
        width:100%;
        border-collapse:collapse;
}

table td, table th 
{
        font-size:1em;
        border:1px solid SlateGray;
        padding:3px 7px 2px 7px;
}

table th
{
        font-size:1.1em;
        text-align:left;
        padding-top:5px;
        padding-bottom:4px;
        background-color:LightSlateGray;
        color:#ffffff;
}

table tr.alt td 
{
        color:#000000;
        background-color:#C9CFD6;
}
"""
PROC_HTML = """<!DOCTYPE html>
<html>
        <head>
                <title>pdb: ${proc_name}</title>

                <meta name="description" content="${proc_blurb}">
                <meta name="author" content="Code Fox">
                <meta charset="UTF-8">

                <link rel="stylesheet" type="text/css" href="proc.css">
        </head>
        <body>
                <div style="display:inline-block;">
                        <h1>
                                ${proc_name}
                        </h1>
                        <div id="author">
                                ${proc_author}
                        </div>
                </div>
                <hr style="margin-bottom:0px;"/>
                <nav>
                        <a href="${prev_link}" style="float:left;">previous</a>
                        <a href="${index_link}">index</a>
                        <a href="${next_link}" style="float:right;">next</a>
                </nav>
                <p id="copyright" style="margin:0">
                        <span class="date">${proc_date}</span><br>
                        ${proc_copyright}
                </p>
                <h4>Description</h4>
                <p id="description">
                        ${proc_blurb}
                </p>
                <h4>Help</h4>
                <p id="help">
                        ${proc_help}
                </p>
                <hr />
                <h4>Type</h4>
                <p id="type">
                        ${proc_type}
                </p>
                <h4>Parameters</h4>
                <table id="parameters">
                        <thead>
                                <tr>
                                        <th>Type</th>
                                        <th>Name</th>
                                        <th>Description</th>
                                </tr>
                        </thead>
                        <tbody>
                                ${parameters}
                        </tbody>
                </table>
                <h4>Return</h4>
                <table id="return">
                        <thead>
                                <tr>
                                        <th>type</th>
                                        <th>name</th>
                                        <th>description</th>
                                </tr>
                        </thead>
                        <tbody>
                                ${results}
                        </tbody>
                </table>
                <hr style="margin-bottom:0px;" />
                <nav>
                        <a href="${index_link}" style="width:100%; text-align:center;">index</a>
                </nav>
        </body>
</html>
"""
INDEX_TEMPLATE = ""

def slugify(value):
    """
    Normalizes string, converts to lowercase, removes non-alpha characters,
    and converts spaces to hyphens.

    Based on code in: Django
    """
    value = unicodedata.normalize('NFKD', unicode(value))
    value = value.encode('ascii', 'ignore')
    value = re.sub('[^\w\s-]', '', value).strip().lower()
    value = re.sub('[-\s]+', '-', value)
    return value

def get_dir() :
        MessageBox = ctypes.windll.user32.MessageBoxA
        response = ""

        # Check for new pygtk: this is new class in PyGtk 2.4
        if (gtk.pygtk_version < (2,3,90)) :
                MessageBox(None, "This plugin requires PyGtk 2.3.90 or later", "Error", 0)
                return response

        dialog = gtk.FileChooserDialog(
                "Dump to...",
                None,
                gtk.FILE_CHOOSER_ACTION_OPEN,
                (
                        gtk.STOCK_CANCEL,
                        gtk.RESPONSE_CANCEL,
                        gtk.STOCK_OPEN,
                        gtk.RESPONSE_OK
                )
        )
        dialog.set_default_response(gtk.RESPONSE_OK)
        dialog.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)

        if (dialog.run() == gtk.RESPONSE_OK) :
                response = dialog.get_filename()
        dialog.destroy()

        return response

def prepare(root) :
        # create sub directory if it doesnt exist
        outDirectory = os.path.join(
                        root,
                        "pdb"
        )

        if not os.path.exists(outDirectory):
                os.makedirs(outDirectory)

        return outDirectory

def dump_css(outDirectory) :
        # write css file
        outFile = os.path.join(
                outDirectory,
                "proc.css"
        )

        with open(outFile,'w') as f:
                f.write(PROC_CSS)

        return None

def dump_proc(proc, outFile, mode) :

        from gimpfu import *

        d = dict()
        d["proc_name"] = proc.proc_name
        d["proc_author"] = proc.proc_author
        d["proc_date"] = proc.proc_date
        d["proc_copyright"] = proc.proc_copyright
        d["proc_blurb"] = proc.proc_blurb
        d["proc_help"] = proc.proc_help

        d["proc_type"] = "unknown"
        if (PLUGIN == proc.proc_type) :
                d["proc_type"] = "PROC_PLUG_IN"
        elif (EXTENSION == proc.proc_type) :
                d["proc_type"] = "PROC_EXTENSION"
        elif (TEMPORARY == proc.proc_type) :
                d["proc_type"] = "PROC_TEMPORARY"

        with open(outFile, mode) as f :
                f.write(Template(PROC_HTML).safe_substitute(d))

        return None

def dump_pdb() :
        MessageBox = ctypes.windll.user32.MessageBoxA

        root = get_dir()
        if("" == root) :
                return None

        outDirectory = prepare(root)
        dump_css(outDirectory)

        # loop through PDB
        procs = gimp.pdb.query()
        procs.sort()
        for i in range(len(procs)):
                name = procs[i]
                outFile = os.path.join(
                        outDirectory,
                        "%s%s"%(slugify(name), ".html")
                )

                dump_proc(pdb[name], outFile, 'w+')
                break

        # write index file

        return None

register(
        #name
        "dump-pdb",
        #blurb
        "dumps pdb database to HTML",
        #help
        "man up buttercup",
        #author
        "codefox",
        #copyright
        "MIT license => rtfm",
        #date
        "Jan 29, 2013",
        #menu path
        "<Toolbox>/Help/Procedure Dump",
        #image types
        None,
        #params
        [],
        #results
        [],
        #function
        dump_pdb
)

main()