Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/webencodings/custom.py: 89%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

38 statements  

1""" 

2 

3 webencodings.custom 

4 ~~~~~~~~~~~~~~~~~~~ 

5 

6 An implementation of custom "replacement" and "x-user-defined" encodings. 

7 

8 :copyright: Copyright 2012 by Simon Sapin 

9 :license: BSD, see LICENSE for details. 

10 

11""" 

12 

13import codecs 

14 

15# Abstract and common classes 

16 

17class Codec(codecs.Codec): 

18 encoding_table = None 

19 decoding_table = None 

20 

21 def encode(self, input, errors='strict'): 

22 return codecs.charmap_encode(input, errors, self.encoding_table) 

23 

24 def decode(self, input, errors='strict'): 

25 return codecs.charmap_decode(input, errors, self.decoding_table) 

26 

27 

28class IncrementalEncoder(codecs.IncrementalEncoder): 

29 encoding_table = None 

30 

31 def encode(self, input, final=False): 

32 return codecs.charmap_encode(input, self.errors, self.encoding_table)[0] 

33 

34 

35class IncrementalDecoder(codecs.IncrementalDecoder): 

36 decoding_table = None 

37 

38 def decode(self, input, final=False): 

39 return codecs.charmap_decode(input, self.errors, self.decoding_table)[0] 

40 

41 

42class StreamWriter(Codec, codecs.StreamWriter): 

43 pass 

44 

45 

46class StreamReader(Codec, codecs.StreamReader): 

47 pass 

48 

49 

50# "x-user-defined" encoding 

51 

52user_decoding_table = ''.join(chr(c if c < 128 else c + 0xF700) for c in range(256)) 

53user_encoding_table = codecs.charmap_build(user_decoding_table) 

54 

55class UserCodec(Codec): 

56 decoding_table = user_decoding_table 

57 encoding_table = user_encoding_table 

58 

59class UserIncrementalEncoder(IncrementalEncoder): 

60 encoding_table = user_encoding_table 

61 

62class UserIncrementalDecoder(IncrementalDecoder): 

63 decoding_table = user_decoding_table 

64 

65user_codec_info = codecs.CodecInfo( 

66 name='x-user-defined', 

67 encode=UserCodec().encode, 

68 decode=UserCodec().decode, 

69 incrementalencoder=UserIncrementalEncoder, 

70 incrementaldecoder=UserIncrementalDecoder, 

71 streamreader=StreamReader, 

72 streamwriter=StreamWriter, 

73) 

74 

75 

76# "replacement" encoding 

77 

78class ReplacementCodec(Codec): 

79 decoding_table = encoding_table = '' 

80 

81class ReplacementIncrementalEncoder(IncrementalEncoder): 

82 encoding_table = '' 

83 

84class ReplacementIncrementalDecoder(IncrementalDecoder): 

85 decoding_table = '' 

86 

87replacement_codec_info = codecs.CodecInfo( 

88 name='replacement', 

89 encode=ReplacementCodec().encode, 

90 decode=ReplacementCodec().decode, 

91 incrementalencoder=ReplacementIncrementalEncoder, 

92 incrementaldecoder=ReplacementIncrementalDecoder, 

93 streamreader=StreamReader, 

94 streamwriter=StreamWriter, 

95)