# Sketch - A Python-based interactive drawing program
# Copyright (C) 1998, 1999 by Bernhard Herzog
#
# This library is free software; you can redistribute it and/or modify
# it under the terms of the GNU Library General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# This library 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
# Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# USA

import operator, string

notdef = '.notdef'

iso_latin_1 = (notdef, notdef, notdef, notdef, notdef, notdef, notdef,
	       notdef, notdef, notdef, notdef, notdef, notdef, notdef,
	       notdef, notdef, notdef, notdef, notdef, notdef, notdef,
	       notdef, notdef, notdef, notdef, notdef, notdef, notdef,
	       notdef, notdef, notdef, notdef, 'space', 'exclam',
	       'quotedbl', 'numbersign', 'dollar', 'percent',
	       'ampersand', 'quoteright', 'parenleft', 'parenright',
	       'asterisk', 'plus', 'comma', 'minus', 'period', 'slash',
	       'zero', 'one', 'two', 'three', 'four', 'five', 'six',
	       'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
	       'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D',
	       'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
	       'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
	       'bracketleft', 'backslash', 'bracketright',
	       'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c',
	       'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
	       'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
	       'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
	       notdef, notdef, notdef, notdef, notdef, notdef, notdef,
	       notdef, notdef, notdef, notdef, notdef, notdef, notdef,
	       notdef, notdef, notdef, 'dotlessi', 'grave', 'acute',
	       'circumflex', 'tilde', 'macron', 'breve', 'dotaccent',
	       'dieresis', notdef, 'ring', 'cedilla', notdef,
	       'hungarumlaut', 'ogonek', 'caron', 'space', 'exclamdown',
	       'cent', 'sterling', 'currency', 'yen', 'brokenbar',
	       'section', 'dieresis', 'copyright', 'ordfeminine',
	       'guillemotleft', 'logicalnot', 'hyphen', 'registered',
	       'macron', 'degree', 'plusminus', 'twosuperior',
	       'threesuperior', 'acute', 'mu', 'paragraph',
	       'periodcentered', 'cedilla', 'onesuperior',
	       'ordmasculine', 'guillemotright', 'onequarter',
	       'onehalf', 'threequarters', 'questiondown', 'Agrave',
	       'Aacute', 'Acircumflex', 'Atilde', 'Adieresis', 'Aring',
	       'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex',
	       'Edieresis', 'Igrave', 'Iacute', 'Icircumflex',
	       'Idieresis', 'Eth', 'Ntilde', 'Ograve', 'Oacute',
	       'Ocircumflex', 'Otilde', 'Odieresis', 'multiply',
	       'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis',
	       'Yacute', 'Thorn', 'germandbls', 'agrave', 'aacute',
	       'acircumflex', 'atilde', 'adieresis', 'aring', 'ae',
	       'ccedilla', 'egrave', 'eacute', 'ecircumflex',
	       'edieresis', 'igrave', 'iacute', 'icircumflex',
	       'idieresis', 'eth', 'ntilde', 'ograve', 'oacute',
	       'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash',
	       'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute',
	       'thorn', 'ydieresis')


adobe_standard = (notdef, notdef, notdef, notdef, notdef, notdef,
                  notdef, notdef, notdef, notdef, notdef, notdef,
                  notdef, notdef, notdef, notdef, notdef, notdef,
                  notdef, notdef, notdef, notdef, notdef, notdef,
                  notdef, notdef, notdef, notdef, notdef, notdef,
                  notdef, notdef, 'space', 'exclam', 'quotedbl',
                  'numbersign', 'dollar', 'percent', 'ampersand',
                  'quoteright', 'parenleft', 'parenright', 'asterisk',
                  'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',
                  'one', 'two', 'three', 'four', 'five', 'six', 'seven',
                  'eight', 'nine', 'colon', 'semicolon', 'less',
                  'equal', 'greater', 'question', 'at', 'A', 'B', 'C',
                  'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
                  'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
                  'Z', 'bracketleft', 'backslash', 'bracketright',
                  'asciicircum', 'underscore', 'quoteleft', 'a', 'b',
                  'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
                  'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
                  'y', 'z', 'braceleft', 'bar', 'braceright',
                  'asciitilde', notdef, notdef, notdef, notdef, notdef,
                  notdef, notdef, notdef, notdef, notdef, notdef,
                  notdef, notdef, notdef, notdef, notdef, notdef,
                  notdef, notdef, notdef, notdef, notdef, notdef,
                  notdef, notdef, notdef, notdef, notdef, notdef,
                  notdef, notdef, notdef, notdef, notdef, 'exclamdown',
                  'cent', 'sterling', 'fraction', 'yen', 'florin',
                  'section', 'currency', 'quotesingle', 'quotedblleft',
                  'guillemotleft', 'guilsinglleft', 'guilsinglright',
                  'fi', 'fl', notdef, 'endash', 'dagger', 'daggerdbl',
                  'periodcentered', notdef, 'paragraph', 'bullet',
                  'quotesinglbase', 'quotedblbase', 'quotedblright',
                  'guillemotright', 'ellipsis', 'perthousand', notdef,
                  'questiondown', notdef, 'grave', 'acute',
                  'circumflex', 'tilde', 'macron', 'breve', 'dotaccent',
                  'dieresis', notdef, 'ring', 'cedilla', notdef,
                  'hungarumlaut', 'ogonek', 'caron', 'emdash', notdef,
                  notdef, notdef, notdef, notdef, notdef, notdef,
                  notdef, notdef, notdef, notdef, notdef, notdef,
                  notdef, notdef, notdef, 'AE', notdef, 'ordfeminine',
                  notdef, notdef, notdef, notdef, 'Lslash', 'Oslash',
                  'OE', 'ordmasculine', notdef, notdef, notdef, notdef,
                  notdef, 'ae', notdef, notdef, notdef, 'dotlessi',
                  notdef, notdef, 'lslash', 'oslash', 'oe',
                  'germandbls', notdef, notdef, notdef, notdef)

class Reencoder:

    def __init__(self, source, dest, notdef = None):
        self.source = source
        self.dest = dest
        if notdef is None:
            try:
                notdef = list(self.source).index('.notdef')
            except:
                notdef = 0
        self.notdef = notdef
        self.build_mapping()

    def build_mapping(self):
        dest = self.dest; source = self.source; notdef = self.notdef
        dict = {}
        length = len(dest)
        map(operator.setitem, [dict] * length, dest, range(length))
        dict[notdef] = self.notdef
        mapping = range(256)
        for i in mapping:
            if source[i] != dest[i]:
                if source[i] == notdef:
                    mapping[i] = notdef
                else:
                    mapping[i] = dict.get(source[i], notdef)
        if mapping == range(256):
            self.mapping = ''
        else:
            self.mapping = string.join(map(chr, mapping), '')

    def __call__(self, text):
        if self.mapping:
            return string.translate(text, self.mapping)
        else:
            return text
