1*cda5da8dSAndroid Build Coastguard Worker#!/usr/bin/env python 2*cda5da8dSAndroid Build Coastguard Worker""" Python Character Mapping Codec for ROT13. 3*cda5da8dSAndroid Build Coastguard Worker 4*cda5da8dSAndroid Build Coastguard WorkerThis codec de/encodes from str to str. 5*cda5da8dSAndroid Build Coastguard Worker 6*cda5da8dSAndroid Build Coastguard WorkerWritten by Marc-Andre Lemburg ([email protected]). 7*cda5da8dSAndroid Build Coastguard Worker""" 8*cda5da8dSAndroid Build Coastguard Worker 9*cda5da8dSAndroid Build Coastguard Workerimport codecs 10*cda5da8dSAndroid Build Coastguard Worker 11*cda5da8dSAndroid Build Coastguard Worker### Codec APIs 12*cda5da8dSAndroid Build Coastguard Worker 13*cda5da8dSAndroid Build Coastguard Workerclass Codec(codecs.Codec): 14*cda5da8dSAndroid Build Coastguard Worker def encode(self, input, errors='strict'): 15*cda5da8dSAndroid Build Coastguard Worker return (str.translate(input, rot13_map), len(input)) 16*cda5da8dSAndroid Build Coastguard Worker 17*cda5da8dSAndroid Build Coastguard Worker def decode(self, input, errors='strict'): 18*cda5da8dSAndroid Build Coastguard Worker return (str.translate(input, rot13_map), len(input)) 19*cda5da8dSAndroid Build Coastguard Worker 20*cda5da8dSAndroid Build Coastguard Workerclass IncrementalEncoder(codecs.IncrementalEncoder): 21*cda5da8dSAndroid Build Coastguard Worker def encode(self, input, final=False): 22*cda5da8dSAndroid Build Coastguard Worker return str.translate(input, rot13_map) 23*cda5da8dSAndroid Build Coastguard Worker 24*cda5da8dSAndroid Build Coastguard Workerclass IncrementalDecoder(codecs.IncrementalDecoder): 25*cda5da8dSAndroid Build Coastguard Worker def decode(self, input, final=False): 26*cda5da8dSAndroid Build Coastguard Worker return str.translate(input, rot13_map) 27*cda5da8dSAndroid Build Coastguard Worker 28*cda5da8dSAndroid Build Coastguard Workerclass StreamWriter(Codec,codecs.StreamWriter): 29*cda5da8dSAndroid Build Coastguard Worker pass 30*cda5da8dSAndroid Build Coastguard Worker 31*cda5da8dSAndroid Build Coastguard Workerclass StreamReader(Codec,codecs.StreamReader): 32*cda5da8dSAndroid Build Coastguard Worker pass 33*cda5da8dSAndroid Build Coastguard Worker 34*cda5da8dSAndroid Build Coastguard Worker### encodings module API 35*cda5da8dSAndroid Build Coastguard Worker 36*cda5da8dSAndroid Build Coastguard Workerdef getregentry(): 37*cda5da8dSAndroid Build Coastguard Worker return codecs.CodecInfo( 38*cda5da8dSAndroid Build Coastguard Worker name='rot-13', 39*cda5da8dSAndroid Build Coastguard Worker encode=Codec().encode, 40*cda5da8dSAndroid Build Coastguard Worker decode=Codec().decode, 41*cda5da8dSAndroid Build Coastguard Worker incrementalencoder=IncrementalEncoder, 42*cda5da8dSAndroid Build Coastguard Worker incrementaldecoder=IncrementalDecoder, 43*cda5da8dSAndroid Build Coastguard Worker streamwriter=StreamWriter, 44*cda5da8dSAndroid Build Coastguard Worker streamreader=StreamReader, 45*cda5da8dSAndroid Build Coastguard Worker _is_text_encoding=False, 46*cda5da8dSAndroid Build Coastguard Worker ) 47*cda5da8dSAndroid Build Coastguard Worker 48*cda5da8dSAndroid Build Coastguard Worker### Map 49*cda5da8dSAndroid Build Coastguard Worker 50*cda5da8dSAndroid Build Coastguard Workerrot13_map = codecs.make_identity_dict(range(256)) 51*cda5da8dSAndroid Build Coastguard Workerrot13_map.update({ 52*cda5da8dSAndroid Build Coastguard Worker 0x0041: 0x004e, 53*cda5da8dSAndroid Build Coastguard Worker 0x0042: 0x004f, 54*cda5da8dSAndroid Build Coastguard Worker 0x0043: 0x0050, 55*cda5da8dSAndroid Build Coastguard Worker 0x0044: 0x0051, 56*cda5da8dSAndroid Build Coastguard Worker 0x0045: 0x0052, 57*cda5da8dSAndroid Build Coastguard Worker 0x0046: 0x0053, 58*cda5da8dSAndroid Build Coastguard Worker 0x0047: 0x0054, 59*cda5da8dSAndroid Build Coastguard Worker 0x0048: 0x0055, 60*cda5da8dSAndroid Build Coastguard Worker 0x0049: 0x0056, 61*cda5da8dSAndroid Build Coastguard Worker 0x004a: 0x0057, 62*cda5da8dSAndroid Build Coastguard Worker 0x004b: 0x0058, 63*cda5da8dSAndroid Build Coastguard Worker 0x004c: 0x0059, 64*cda5da8dSAndroid Build Coastguard Worker 0x004d: 0x005a, 65*cda5da8dSAndroid Build Coastguard Worker 0x004e: 0x0041, 66*cda5da8dSAndroid Build Coastguard Worker 0x004f: 0x0042, 67*cda5da8dSAndroid Build Coastguard Worker 0x0050: 0x0043, 68*cda5da8dSAndroid Build Coastguard Worker 0x0051: 0x0044, 69*cda5da8dSAndroid Build Coastguard Worker 0x0052: 0x0045, 70*cda5da8dSAndroid Build Coastguard Worker 0x0053: 0x0046, 71*cda5da8dSAndroid Build Coastguard Worker 0x0054: 0x0047, 72*cda5da8dSAndroid Build Coastguard Worker 0x0055: 0x0048, 73*cda5da8dSAndroid Build Coastguard Worker 0x0056: 0x0049, 74*cda5da8dSAndroid Build Coastguard Worker 0x0057: 0x004a, 75*cda5da8dSAndroid Build Coastguard Worker 0x0058: 0x004b, 76*cda5da8dSAndroid Build Coastguard Worker 0x0059: 0x004c, 77*cda5da8dSAndroid Build Coastguard Worker 0x005a: 0x004d, 78*cda5da8dSAndroid Build Coastguard Worker 0x0061: 0x006e, 79*cda5da8dSAndroid Build Coastguard Worker 0x0062: 0x006f, 80*cda5da8dSAndroid Build Coastguard Worker 0x0063: 0x0070, 81*cda5da8dSAndroid Build Coastguard Worker 0x0064: 0x0071, 82*cda5da8dSAndroid Build Coastguard Worker 0x0065: 0x0072, 83*cda5da8dSAndroid Build Coastguard Worker 0x0066: 0x0073, 84*cda5da8dSAndroid Build Coastguard Worker 0x0067: 0x0074, 85*cda5da8dSAndroid Build Coastguard Worker 0x0068: 0x0075, 86*cda5da8dSAndroid Build Coastguard Worker 0x0069: 0x0076, 87*cda5da8dSAndroid Build Coastguard Worker 0x006a: 0x0077, 88*cda5da8dSAndroid Build Coastguard Worker 0x006b: 0x0078, 89*cda5da8dSAndroid Build Coastguard Worker 0x006c: 0x0079, 90*cda5da8dSAndroid Build Coastguard Worker 0x006d: 0x007a, 91*cda5da8dSAndroid Build Coastguard Worker 0x006e: 0x0061, 92*cda5da8dSAndroid Build Coastguard Worker 0x006f: 0x0062, 93*cda5da8dSAndroid Build Coastguard Worker 0x0070: 0x0063, 94*cda5da8dSAndroid Build Coastguard Worker 0x0071: 0x0064, 95*cda5da8dSAndroid Build Coastguard Worker 0x0072: 0x0065, 96*cda5da8dSAndroid Build Coastguard Worker 0x0073: 0x0066, 97*cda5da8dSAndroid Build Coastguard Worker 0x0074: 0x0067, 98*cda5da8dSAndroid Build Coastguard Worker 0x0075: 0x0068, 99*cda5da8dSAndroid Build Coastguard Worker 0x0076: 0x0069, 100*cda5da8dSAndroid Build Coastguard Worker 0x0077: 0x006a, 101*cda5da8dSAndroid Build Coastguard Worker 0x0078: 0x006b, 102*cda5da8dSAndroid Build Coastguard Worker 0x0079: 0x006c, 103*cda5da8dSAndroid Build Coastguard Worker 0x007a: 0x006d, 104*cda5da8dSAndroid Build Coastguard Worker}) 105*cda5da8dSAndroid Build Coastguard Worker 106*cda5da8dSAndroid Build Coastguard Worker### Filter API 107*cda5da8dSAndroid Build Coastguard Worker 108*cda5da8dSAndroid Build Coastguard Workerdef rot13(infile, outfile): 109*cda5da8dSAndroid Build Coastguard Worker outfile.write(codecs.encode(infile.read(), 'rot-13')) 110*cda5da8dSAndroid Build Coastguard Worker 111*cda5da8dSAndroid Build Coastguard Workerif __name__ == '__main__': 112*cda5da8dSAndroid Build Coastguard Worker import sys 113*cda5da8dSAndroid Build Coastguard Worker rot13(sys.stdin, sys.stdout) 114