#!/usr/bin/env python # encoding: utf-8 # # Copyright (c) 2010 Doug Hellmann. All rights reserved. # """Set up the invertcaps codec. """ #end_pymotw_header import codecs from codecs_invertcaps_charmap import encoding_map, decoding_map # Stateless encoder/decoder class InvertCapsCodec(codecs.Codec): def encode(self, input, errors='strict'): return codecs.charmap_encode(input, errors, encoding_map) def decode(self, input, errors='strict'): return codecs.charmap_decode(input, errors, decoding_map) # Incremental forms class InvertCapsIncrementalEncoder(codecs.IncrementalEncoder): def encode(self, input, final=False): return codecs.charmap_encode(input, self.errors, encoding_map)[0] class InvertCapsIncrementalDecoder(codecs.IncrementalDecoder): def decode(self, input, final=False): return codecs.charmap_decode(input, self.errors, decoding_map)[0] # Stream reader and writer class InvertCapsStreamReader(InvertCapsCodec, codecs.StreamReader): pass class InvertCapsStreamWriter(InvertCapsCodec, codecs.StreamWriter): pass # Register the codec search function def find_invertcaps(encoding): """Return the codec for 'invertcaps'. """ if encoding == 'invertcaps': return codecs.CodecInfo( name='invertcaps', encode=InvertCapsCodec().encode, decode=InvertCapsCodec().decode, incrementalencoder=InvertCapsIncrementalEncoder, incrementaldecoder=InvertCapsIncrementalDecoder, streamreader=InvertCapsStreamReader, streamwriter=InvertCapsStreamWriter, ) return None codecs.register(find_invertcaps) if __name__ == '__main__': # Stateless encoder/decoder encoder = codecs.getencoder('invertcaps') text = 'abc.DEF' encoded_text, consumed = encoder(text) print 'Encoder converted "{}" to "{}", consuming {} characters'.format( text, encoded_text, consumed) # Stream writer import sys writer = codecs.getwriter('invertcaps')(sys.stdout) print 'StreamWriter for stdout: ', writer.write('abc.DEF') print # Incremental decoder decoder_factory = codecs.getincrementaldecoder('invertcaps') decoder = decoder_factory() decoded_text_parts = [] for c in encoded_text: decoded_text_parts.append(decoder.decode(c, final=False)) decoded_text_parts.append(decoder.decode('', final=True)) decoded_text = ''.join(decoded_text_parts) print 'IncrementalDecoder converted "{}" to "{}"'.format( encoded_text, decoded_text)