Let us walk on the 3-isogeny graph
Loading...
Searching...
No Matches
codec.py
Go to the documentation of this file.
1from .core import encode, decode, alabel, ulabel, IDNAError
2import codecs
3import re
4from typing import Tuple, Optional
5
6_unicode_dots_re = re.compile('[\u002e\u3002\uff0e\uff61]')
7
9
10 def encode(self, data: str, errors: str = 'strict') -> Tuple[bytes, int]:
11 if errors != 'strict':
12 raise IDNAError('Unsupported error handling \"{}\"'.format(errors))
13
14 if not data:
15 return b"", 0
16
17 return encode(data), len(data)
18
19 def decode(self, data: bytes, errors: str = 'strict') -> Tuple[str, int]:
20 if errors != 'strict':
21 raise IDNAError('Unsupported error handling \"{}\"'.format(errors))
22
23 if not data:
24 return '', 0
25
26 return decode(data), len(data)
27
29 def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore
30 if errors != 'strict':
31 raise IDNAError('Unsupported error handling \"{}\"'.format(errors))
32
33 if not data:
34 return "", 0
35
36 labels = _unicode_dots_re.split(data)
37 trailing_dot = ''
38 if labels:
39 if not labels[-1]:
40 trailing_dot = '.'
41 del labels[-1]
42 elif not final:
43 # Keep potentially unfinished label until the next call
44 del labels[-1]
45 if labels:
46 trailing_dot = '.'
47
48 result = []
49 size = 0
50 for label in labels:
51 result.append(alabel(label))
52 if size:
53 size += 1
54 size += len(label)
55
56 # Join with U+002E
57 result_str = '.'.join(result) + trailing_dot # type: ignore
58 size += len(trailing_dot)
59 return result_str, size
60
62 def _buffer_decode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore
63 if errors != 'strict':
64 raise IDNAError('Unsupported error handling \"{}\"'.format(errors))
65
66 if not data:
67 return ('', 0)
68
69 labels = _unicode_dots_re.split(data)
70 trailing_dot = ''
71 if labels:
72 if not labels[-1]:
73 trailing_dot = '.'
74 del labels[-1]
75 elif not final:
76 # Keep potentially unfinished label until the next call
77 del labels[-1]
78 if labels:
79 trailing_dot = '.'
80
81 result = []
82 size = 0
83 for label in labels:
84 result.append(ulabel(label))
85 if size:
86 size += 1
87 size += len(label)
88
89 result_str = '.'.join(result) + trailing_dot
90 size += len(trailing_dot)
91 return (result_str, size)
92
93
95 pass
96
97
98class StreamReader(Codec, codecs.StreamReader):
99 pass
100
101
102def getregentry() -> codecs.CodecInfo:
103 # Compatibility as a search_function for codecs.register()
104 return codecs.CodecInfo(
105 name='idna',
106 encode=Codec().encode, # type: ignore
107 decode=Codec().decode, # type: ignore
108 incrementalencoder=IncrementalEncoder,
109 incrementaldecoder=IncrementalDecoder,
110 streamwriter=StreamWriter,
111 streamreader=StreamReader,
112 )
Tuple[str, int] _buffer_decode(self, str data, str errors, bool final)
Definition codec.py:62
Tuple[str, int] _buffer_encode(self, str data, str errors, bool final)
Definition codec.py:29
codecs.CodecInfo getregentry()
Definition codec.py:102
for i