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