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