comparison env/lib/python3.7/site-packages/idna/codec.py @ 5:9b1c78e6ba9c draft default tip

"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author shellac
date Mon, 01 Jun 2020 08:59:25 -0400
parents 79f47841a781
children
comparison
equal deleted inserted replaced
4:79f47841a781 5:9b1c78e6ba9c
1 from .core import encode, decode, alabel, ulabel, IDNAError
2 import codecs
3 import re
4
5 _unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]')
6
7 class Codec(codecs.Codec):
8
9 def encode(self, data, errors='strict'):
10
11 if errors != 'strict':
12 raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
13
14 if not data:
15 return "", 0
16
17 return encode(data), len(data)
18
19 def decode(self, data, errors='strict'):
20
21 if errors != 'strict':
22 raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
23
24 if not data:
25 return u"", 0
26
27 return decode(data), len(data)
28
29 class IncrementalEncoder(codecs.BufferedIncrementalEncoder):
30 def _buffer_encode(self, data, errors, final):
31 if errors != 'strict':
32 raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
33
34 if not data:
35 return ("", 0)
36
37 labels = _unicode_dots_re.split(data)
38 trailing_dot = u''
39 if labels:
40 if not labels[-1]:
41 trailing_dot = '.'
42 del labels[-1]
43 elif not final:
44 # Keep potentially unfinished label until the next call
45 del labels[-1]
46 if labels:
47 trailing_dot = '.'
48
49 result = []
50 size = 0
51 for label in labels:
52 result.append(alabel(label))
53 if size:
54 size += 1
55 size += len(label)
56
57 # Join with U+002E
58 result = ".".join(result) + trailing_dot
59 size += len(trailing_dot)
60 return (result, size)
61
62 class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
63 def _buffer_decode(self, data, errors, final):
64 if errors != 'strict':
65 raise IDNAError("Unsupported error handling \"{0}\"".format(errors))
66
67 if not data:
68 return (u"", 0)
69
70 # IDNA allows decoding to operate on Unicode strings, too.
71 if isinstance(data, unicode):
72 labels = _unicode_dots_re.split(data)
73 else:
74 # Must be ASCII string
75 data = str(data)
76 unicode(data, "ascii")
77 labels = data.split(".")
78
79 trailing_dot = u''
80 if labels:
81 if not labels[-1]:
82 trailing_dot = u'.'
83 del labels[-1]
84 elif not final:
85 # Keep potentially unfinished label until the next call
86 del labels[-1]
87 if labels:
88 trailing_dot = u'.'
89
90 result = []
91 size = 0
92 for label in labels:
93 result.append(ulabel(label))
94 if size:
95 size += 1
96 size += len(label)
97
98 result = u".".join(result) + trailing_dot
99 size += len(trailing_dot)
100 return (result, size)
101
102
103 class StreamWriter(Codec, codecs.StreamWriter):
104 pass
105
106 class StreamReader(Codec, codecs.StreamReader):
107 pass
108
109 def getregentry():
110 return codecs.CodecInfo(
111 name='idna',
112 encode=Codec().encode,
113 decode=Codec().decode,
114 incrementalencoder=IncrementalEncoder,
115 incrementaldecoder=IncrementalDecoder,
116 streamwriter=StreamWriter,
117 streamreader=StreamReader,
118 )