diff options
Diffstat (limited to 'plug-ins/pygimp/plug-ins/colorxhtml.py')
-rwxr-xr-x | plug-ins/pygimp/plug-ins/colorxhtml.py | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/plug-ins/pygimp/plug-ins/colorxhtml.py b/plug-ins/pygimp/plug-ins/colorxhtml.py new file mode 100755 index 0000000..011f8ca --- /dev/null +++ b/plug-ins/pygimp/plug-ins/colorxhtml.py @@ -0,0 +1,212 @@ +#!/usr/bin/env python2 + +# Gimp-Python - allows the writing of Gimp plugins in Python. +# Copyright (C) 2003, 2005 Manish Singh <yosh@gimp.org> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. + +import string +import struct +import inspect +import os.path + +import gimp +from gimpfu import * + +gettext.install("gimp20-python", gimp.locale_directory, unicode=True) + +all_source_types = (CHARS_SOURCE, CHARS_FILE, CHARS_PARAMETER) = range(3) + +escape_table = { + '&': '&', + '<': '<', + '>': '>', + '"': '"' +} + +style_def = """body { + width: 100%%; + font-size: %dpx; + background-color: #000000; + color: #ffffff; +} +""" + +preamble = """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html> +<head> +<title>CSS Color XHTML written by GIMP</title> +%s +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +</head> +<body> +<pre> +""" + +postamble = """\n</pre>\n</body>\n</html>\n""" + +def colorxhtml(img, drawable, filename, raw_filename, + source_type, characters, size, separate): + width = drawable.width + height = drawable.height + bpp = drawable.bpp + + if not drawable.is_rgb or drawable.has_alpha: + return + + if source_type not in all_source_types: + return + + gimp.tile_cache_ntiles(width / gimp.tile_width() + 1) + + html = file(filename, 'w') + + if separate: + dirname, cssfile = os.path.split(filename) + cssfile = os.path.splitext(cssfile)[0] + '.css' + cssname = os.path.join(dirname, cssfile) + + css = file(cssname, 'w') + + if source_type == CHARS_SOURCE: + chars = file(inspect.getsourcefile(colorxhtml)).read() + elif source_type == CHARS_FILE: + chars = file(characters).read() + elif source_type == CHARS_PARAMETER: + chars = characters + + allchars = string.maketrans('', '') + + goodchars = string.digits + string.ascii_letters + string.punctuation + badchars = ''.join([c for c in allchars if c not in goodchars]) + + chars = chars.translate(allchars, badchars) + + data = [] + + for c in chars: + data.append(escape_table.get(c, c)) + + if data: + data.reverse() + else: + data = list('X' * 80) + + pr = drawable.get_pixel_rgn(0, 0, width, height, False, False) + + gimp.progress_init(_("Saving as colored XHTML")) + + style = style_def % size + + if separate: + ss = '<link rel="stylesheet" type="text/css" href="%s" />' % cssfile + css.write(style) + else: + ss = '<style type="text/css">\n%s</style>' % style + + html.write(preamble % ss) + + colors = {} + chars = [] + + for y in range(0, height): + row = pr[0:width, y] + + while len(chars) < width: + chars[0:0] = data + + for pixel in RowIterator(row, bpp): + color = '%02x%02x%02x' % pixel + style = 'background-color:black; color:#%s;' % color + char = chars.pop() + + if separate: + if color not in colors: + css.write('span.N%s { %s }\n' % (color, style)) + colors[color] = 1 + + html.write('<span class="N%s">%s</span>' % (color, char)) + + else: + html.write('<span style="%s">%s</span>' % (style, char)) + + html.write('\n') + + gimp.progress_update(y / float(height)) + + html.write(postamble) + + html.close() + + if separate: + css.close() + +def register_save(): + gimp.register_save_handler("file-colorxhtml-save", "xhtml", "") + +class RowIterator: + def __init__(self, row, bpp): + self.row = row + self.bpp = bpp + + self.start = 0 + self.stop = bpp + + self.length = len(row) + self.fmt = 'B' * bpp + + def __iter__(self): + return iter(self.get_pixel, None) + + def get_pixel(self): + if self.stop > self.length: + return None + + pixel = struct.unpack(self.fmt, self.row[self.start:self.stop]) + + self.start += self.bpp + self.stop += self.bpp + + return pixel + +register( + "file-colorxhtml-save", + N_("Save as colored XHTML"), + "Saves the image as colored XHTML text (based on Perl version by Marc Lehmann)", + "Manish Singh and Carol Spears", + "Manish Singh and Carol Spears", + "2003", + N_("Colored XHTML"), + "RGB", + [ + (PF_IMAGE, "image", "Input image", None), + (PF_DRAWABLE, "drawable", "Input drawable", None), + (PF_STRING, "filename", "The name of the file", None), + (PF_STRING, "raw-filename", "The name of the file", None), + (PF_RADIO, "source", _("Character _source"), 0, + ((_("Source code"), CHARS_SOURCE), + (_("Text file"), CHARS_FILE), + (_("Entry box"), CHARS_PARAMETER))), + (PF_FILE, "characters", _("_File to read or characters to use"), + ""), + (PF_INT, "font-size", _("Fo_nt size in pixels"), 10), + (PF_BOOL, "separate", _("_Write a separate CSS file"), True) + ], + [], + colorxhtml, on_query=register_save, + menu="<Save>", domain=("gimp20-python", gimp.locale_directory) + ) + +main() |