-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathhtml.py
More file actions
288 lines (274 loc) · 28.6 KB
/
html.py
File metadata and controls
288 lines (274 loc) · 28.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
# -*- coding: UTF-8 -*-
"""HTML entity Codec - html entity content encoding.
This codec:
- en/decodes strings from str to str
- en/decodes strings from bytes to bytes
- decodes file content to str (read)
- encodes file content from str to bytes (write)
"""
from ..__common__ import *
__examples__ = {
'enc(html_entities|html-entity)': {'<This\tis\na test>': "<This	is
a test>"},
'enc(html)': {'\u1234': "&1234;"},
'dec(html|html_entity)': {'&DoesNotExist;': None},
'dec(html_entities|html-entity)': {
'<This	is
a test>': "<This\tis\na test>",
'<This	is
a test>': "<This\tis\na test>",
},
}
# source: https://dev.w3.org/html5/html-author/charref
ENCMAP = {
'\t': "	", '\n': "
", '!': "!", '"': """, '#': "#", '$': "$", '%': "%",
'&': "&", '\'': "'", '(': "(", ')': ")", '*': "*", '+': "+", ',': ",",
'.': ".", '/': "/", ':': ":", ';': ";", '<': "<", '=': "=", '>': ">",
'?': "?", '@': "@", '[': "[", '\\': "\", ']': "]", '^': "^", '_': "_",
'`': "`", '{': "{", '|': "|", '}': "}", '¡': "¡", '¢': "¢",
'£': "£", '¤': "¤", '¥': "¥", '¦': "¦", '§': "§", '¨': "¨", '©': "©",
'ª': "ª", '«': "«", '¬': "¬", '': "­", '®': "®", '¯': "¯", '°': "°",
'±': "±", '²': "²", '³': "³", '´': "´", 'µ': "µ", '¶': "¶", '·': "·",
'¸': "¸", '¹': "¹", 'º': "º", '»': "»", '¼': "¼", '½': "½", '¾': "¾",
'¿': "¿", 'À': "À", 'Á': "Á", 'Â': "Â", 'Ã': "Ã", 'Ä': "Ä", 'Å': "Å",
'Æ': "Æ", 'Ç': "Ç", 'È': "È", 'É': "É", 'Ê': "Ê", 'Ë': "Ë", 'Ì': "Ì",
'Í': "Í", 'Î': "Î", 'Ï': "Ï", 'Ð': "Ð", 'Ñ': "Ñ", 'Ò': "Ò", 'Ó': "Ó",
'Ô': "Ô", 'Õ': "Õ", 'Ö': "Ö", '×': "×", 'Ø': "Ø", 'Ù': "Ù", 'Ú': "Ú",
'Û': "Û", 'Ü': "Ü", 'Ý': "Ý", 'Þ': "Þ", 'ß': "ß", 'à': "à", 'á': "á",
'â': "â", 'ã': "ã", 'ä': "ä", 'å': "å", 'æ': "æ", 'ç': "ç", 'è': "è",
'é': "é", 'ê': "ê", 'ë': "ë", 'ì': "ì", 'í': "í", 'î': "î", 'ï': "ï",
'ð': "ð", 'ñ': "ñ", 'ò': "ò", 'ó': "ó", 'ô': "ô", 'õ': "õ", 'ö': "ö",
'÷': "÷", 'ø': "ø", 'ù': "ù", 'ú': "ú", 'û': "û", 'ü': "ü", 'ý': "ý",
'þ': "þ", 'ÿ': "ÿ", 'Ā': "Ā", 'ā': "ā", 'Ă': "Ă", 'ă': "ă", 'Ą': "Ą",
'ą': "ą", 'Ć': "Ć", 'ć': "ć", 'Ĉ': "Ĉ", 'ĉ': "ĉ", 'Ċ': "Ċ", 'ċ': "ċ",
'Č': "Č", 'č': "č", 'Ď': "Ď", 'ď': "ď", 'Đ': "Đ", 'đ': "đ",
'Ē': "Ē", 'ē': "ē", 'Ė': "Ė", 'ė': "ė", 'Ę': "Ę", 'ę': "ę", 'Ě': "Ě",
'ě': "ě", 'Ĝ': "Ĝ", 'ĝ': "ĝ", 'Ğ': "Ğ", 'ğ': "ğ", 'Ġ': "Ġ", 'ġ': "ġ",
'Ģ': "Ģ", 'Ĥ': "Ĥ", 'ĥ': "ĥ", 'Ħ': "Ħ", 'ħ': "ħ", 'Ĩ': "Ĩ",
'ĩ': "ĩ", 'Ī': "Ī", 'ī': "ī", 'Į': "Į", 'į': "į", 'İ': "İ", 'ı': "ı",
'IJ': "IJ", 'ij': "ij", 'Ĵ': "Ĵ", 'ĵ': "ĵ", 'Ķ': "Ķ", 'ķ': "ķ", 'ĸ': "ĸ",
'Ĺ': "Ĺ", 'ĺ': "ĺ", 'Ļ': "Ļ", 'ļ': "ļ", 'Ľ': "Ľ", 'ľ': "ľ",
'Ŀ': "Ŀ", 'ŀ': "ŀ", 'Ł': "Ł", 'ł': "ł", 'Ń': "Ń", 'ń': "ń",
'Ņ': "Ņ", 'ņ': "ņ", 'Ň': "Ň", 'ň': "ň", 'ʼn': "ʼn", 'Ŋ': "Ŋ", 'ŋ': "ŋ",
'Ō': "Ō", 'ō': "ō", 'Ő': "Ő", 'ő': "ő", 'Œ': "Œ", 'œ': "œ", 'Ŕ': "Ŕ",
'ŕ': "ŕ", 'Ŗ': "Ŗ", 'ŗ': "ŗ", 'Ř': "Ř", 'ř': "ř", 'Ś': "Ś",
'ś': "ś", 'Ŝ': "Ŝ", 'ŝ': "ŝ", 'Ş': "Ş", 'ş': "ş", 'Š': "Š",
'š': "š", 'Ţ': "Ţ", 'ţ': "ţ", 'Ť': "Ť", 'ť': "ť", 'Ŧ': "Ŧ",
'ŧ': "ŧ", 'Ũ': "Ũ", 'ũ': "ũ", 'Ū': "Ū", 'ū': "ū", 'Ŭ': "Ŭ",
'ŭ': "ŭ", 'Ů': "Ů", 'ů': "ů", 'Ű': "Ű", 'ű': "ű", 'Ų': "Ų", 'ų': "ų",
'Ŵ': "Ŵ", 'ŵ': "ŵ", 'Ŷ': "Ŷ", 'ŷ': "ŷ", 'Ÿ': "Ÿ", 'Ź': "Ź", 'ź': "ź",
'Ż': "Ż", 'ż': "ż", 'Ž': "Ž", 'ž': "ž", 'ƒ': "ƒ", 'Ƶ': "Ƶ", 'ǵ': "ǵ",
'ȷ': "ȷ", 'ˆ': "ˆ", 'ˇ': "ˇ", '˘': "˘", '˙': "˙", '˚': "˚", '˛': "˛",
'˜': "˜", '˝': "˝", '̑': "̑", '̲': "_", 'Α': "Α", 'Β': "Β",
'Γ': "Γ", 'Δ': "Δ", 'Ε': "Ε", 'Ζ': "Ζ", 'Η': "Η", 'Θ': "Θ", 'Ι': "Ι",
'Κ': "Κ", 'Λ': "Λ", 'Μ': "Μ", 'Ν': "Ν", 'Ξ': "Ξ", 'Ο': "Ο", 'Π': "Π",
'Ρ': "Ρ", 'Σ': "Σ", 'Τ': "Τ", 'Υ': "Υ", 'Φ': "Φ", 'Χ': "Χ", 'Ψ': "Ψ",
'Ω': "Ω", 'α': "α", 'β': "β", 'γ': "γ", 'δ': "δ", 'ε': "ϵ", 'ζ': "ζ",
'η': "η", 'θ': "θ", 'ι': "ι", 'κ': "κ", 'λ': "λ", 'μ': "μ", 'ν': "ν",
'ξ': "ξ", 'ο': "ο", 'π': "π", 'ρ': "ρ", 'ς': "ς", 'σ': "σ", 'τ': "τ",
'υ': "υ", 'φ': "φ", 'χ': "χ", 'ψ': "ψ", 'ω': "ω", 'ϑ': "ϑ", 'ϒ': "ϒ",
'ϕ': "ϕ", 'ϖ': "ϖ", 'Ϝ': "Ϝ", 'ϝ': "ϝ", 'ϰ': "ϰ", 'ϱ': "ϱ",
'ϵ': "ε", '϶': "϶", 'Ё': "Ё", 'Ђ': "Ђ", 'Ѓ': "Ѓ", 'Є': "Є", 'Ѕ': "Ѕ",
'І': "І", 'Ї': "Ї", 'Ј': "Ј", 'Љ': "Љ", 'Њ': "Њ", 'Ћ': "Ћ", 'Ќ': "Ќ",
'Ў': "Ў", 'Џ': "Џ", 'А': "А", 'Б': "Б", 'В': "В", 'Г': "Г", 'Д': "Д", 'Е': "Е",
'Ж': "Ж", 'З': "З", 'И': "И", 'Й': "Й", 'К': "К", 'Л': "Л", 'М': "М", 'Н': "Н",
'О': "О", 'П': "П", 'Р': "Р", 'С': "С", 'Т': "Т", 'У': "У", 'Ф': "Ф", 'Х': "Х",
'Ц': "Ц", 'Ч': "Ч", 'Ш': "Ш", 'Щ': "Щ", 'Ъ': "Ъ", 'Ы': "Ы", 'Ь': "Ь",
'Э': "Э", 'Ю': "Ю", 'Я': "Я", 'а': "а", 'б': "б", 'в': "в", 'г': "г", 'д': "д",
'е': "е", 'ж': "ж", 'з': "з", 'и': "и", 'й': "й", 'к': "к", 'л': "л", 'м': "м",
'н': "н", 'о': "о", 'п': "п", 'р': "р", 'с': "с", 'т': "т", 'у': "у", 'ф': "ф",
'х': "х", 'ц': "ц", 'ч': "ч", 'ш': "ш", 'щ': "щ", 'ъ': "ъ", 'ы': "ы",
'ь': "ь", 'э': "э", 'ю': "ю", 'я': "я", 'ё': "ё", 'ђ': "ђ", 'ѓ': "ѓ",
'є': "є", 'ѕ': "ѕ", 'і': "і", 'ї': "ї", 'ј': "ј", 'љ': "љ", 'њ': "њ",
'ћ': "ћ", 'ќ': "ќ", 'ў': "ў", 'џ': "џ", '\u2002': " ", '\u2003': " ",
'\u2004': " ", '\u2005': " ", '\u2007': " ", '\u2008': " ", '\u2009': " ",
'\u200a': " ", '\u200b': "​", '\u200c': "‌", '\u200d': "‍", '\u200e': "‎",
'\u200f': "‏", '‐': "‐", '–': "–", '—': "—",
'―': "―", '‖': "‖", '‘': "‘", '’': "’", '‚': "‚", '“': "“", '”': "”",
'„': "„", '†': "†", '‡': "‡", '•': "•", '‥': "‥", '…': "…", '‰': "‰",
'‱': "‱", '′': "′", '″': "″", '‴': "‴", '‵': "‵", '‹': "‹",
'›': "›", '‾': "‾", '⁁': "⁁", '⁃': "⁃", '⁄': "⁄", '⁏': "⁏", '⁗': "⁗",
'\u205f': " ", '': "⁠", '': "⁡", '': "⁢", '': "⁣",
'€': "€", '⃛': "⃛", '⃜': "⃜", 'ℂ': "ℂ", '℅': "℅", 'ℊ': "ℊ", 'ℋ': "ℋ",
'ℌ': "ℌ", 'ℍ': "ℍ", 'ℎ': "ℎ", 'ℏ': "ℏ", 'ℐ': "ℐ", 'ℑ': "ℑ",
'ℒ': "ℒ", 'ℓ': "ℓ", 'ℕ': "ℕ", '№': "№", '℗': "℗", '℘': "℘", 'ℙ': "ℙ",
'ℚ': "ℚ", 'ℛ': "ℛ", 'ℜ': "ℜ", 'ℝ': "ℝ", '℞': "℞", '™': "™", 'ℤ': "ℤ",
'Ω': "Ω", '℧': "℧", 'ℨ': "ℨ", '℩': "℩", 'Å': "Å", 'ℬ': "ℬ", 'ℭ': "ℭ",
'ℯ': "ℯ", 'ℰ': "ℰ", 'ℱ': "ℱ", 'ℳ': "ℳ", 'ℴ': "ℴ", 'ℵ': "ℵ", 'ℶ': "ℶ",
'ℷ': "ℷ", 'ℸ': "ℸ", 'ⅅ': "ⅅ", 'ⅆ': "ⅆ", 'ⅇ': "ⅇ",
'ⅈ': "ⅈ", '⅓': "⅓", '⅔': "⅔", '⅕': "⅕", '⅖': "⅖", '⅗': "⅗",
'⅘': "⅘", '⅙': "⅙", '⅚': "⅚", '⅛': "⅛", '⅜': "⅜", '⅝': "⅝",
'⅞': "⅞", '←': "←", '↑': "↑", '→': "→", '↓': "↓", '↔': "↔", '↕': "↕",
'↖': "↖", '↗': "↗", '↘': "↘", '↙': "↙", '↚': "↚", '↛': "↛", '↝': "↝",
'↞': "↞", '↟': "↟", '↠': "↠", '↡': "↡", '↢': "↢", '↣': "↣",
'↤': "↤", '↥': "↥", '↦': "↦", '↧': "↧", '↩': "↩", '↪': "↪",
'↫': "↫", '↬': "↬", '↭': "↭", '↮': "↮", '↰': "↰", '↱': "↱", '↲': "↲",
'↳': "↳", '↵': "↵", '↶': "↶", '↷': "↷", '↺': "↺", '↻': "↻", '↼': "↼",
'↽': "↽", '↾': "↾", '↿': "↿", '⇀': "⇀", '⇁': "⇁", '⇂': "⇂", '⇃': "⇃",
'⇄': "⇄", '⇅': "⇅", '⇆': "⇆", '⇇': "⇇", '⇈': "⇈", '⇉': "⇉", '⇊': "⇊",
'⇋': "⇋", '⇌': "⇌", '⇍': "⇍", '⇎': "⇎", '⇏': "⇏", '⇐': "⇐", '⇑': "⇑",
'⇒': "⇒", '⇓': "⇓", '⇔': "⇔", '⇕': "⇕", '⇖': "⇖", '⇗': "⇗", '⇘': "⇘",
'⇙': "⇙", '⇚': "⇚", '⇛': "⇛", '⇝': "⇝", '⇤': "⇤", '⇥': "⇥", '⇵': "⇵",
'⇽': "⇽", '⇾': "⇾", '⇿': "⇿", '∀': "∀", '∁': "∁", '∂': "∂", '∃': "∃",
'∄': "∄", '∅': "∅", '∇': "∇", '∈': "∈", '∉': "∉", '∋': "∋", '∌': "∌",
'∏': "∏", '∐': "∐", '∑': "∑", '−': "−", '∓': "∓", '∔': "∔", '∖': "∖",
'∗': "∗", '∘': "∘", '√': "√", '∝': "∝", '∞': "∞", '∟': "∟", '∠': "∠",
'∡': "∡", '∢': "∢", '∣': "∣", '∤': "∤", '∥': "∥", '∦': "∦", '∧': "∧",
'∨': "∨", '∩': "∩", '∪': "∪", '∫': "∫", '∬': "∬", '∭': "∭", '∮': "∮",
'∯': "∯", '∰': "∰", '∱': "∱", '∲': "∲", '∳': "∳", '∴': "∴",
'∵': "∵", '∶': "∶", '∷': "∷", '∸': "∸", '∺': "∺", '∻': "∻", '∼': "∼",
'∽': "∽", '∾': "∾", '∿': "∿", '≀': "≀", '≁': "≁", '≂': "≂", '≃': "≃",
'≄': "≄", '≅': "≅", '≆': "≆", '≇': "≇", '≈': "≈", '≉': "≉", '≊': "≊",
'≋': "≋", '≌': "≌", '≍': "≍", '≎': "≎", '≏': "≏", '≐': "≐", '≑': "≑",
'≒': "≒", '≓': "≓", '≔': "≔", '≕': "≕", '≖': "≖", '≗': "≗", '≙': "≙",
'≚': "≚", '≜': "≜", '≟': "≟", '≠': "≠", '≡': "≡", '≢': "≢", '≤': "≤",
'≥': "≥", '≦': "≦", '≧': "≧", '≨': "≨", '≩': "≩", '≪': "≪", '≫': "≫", '≬': "≬",
'≭': "≭", '≮': "≮", '≯': "≯", '≰': "≰", '≱': "≱", '≲': "≲", '≳': "≳",
'≴': "≴", '≵': "≵", '≶': "≶", '≷': "≷", '≸': "≸", '≹': "≹", '≺': "≺", '≻': "≻",
'≼': "≼", '≽': "≽", '≾': "≾", '≿': "≿", '⊀': "⊀", '⊁': "⊁", '⊂': "⊂",
'⊃': "⊃", '⊄': "⊄", '⊅': "⊅", '⊆': "⊆", '⊇': "⊇", '⊈': "⊈", '⊉': "⊉",
'⊊': "⊊", '⊋': "⊋", '⊍': "⊍", '⊎': "⊎", '⊏': "⊏", '⊐': "⊐", '⊑': "⊑",
'⊒': "⊒", '⊓': "⊓", '⊔': "⊔", '⊕': "⊕", '⊖': "⊖", '⊗': "⊗", '⊘': "⊘",
'⊙': "⊙", '⊚': "⊚", '⊛': "⊛", '⊝': "⊝", '⊞': "⊞", '⊟': "⊟", '⊠': "⊠",
'⊡': "⊡", '⊢': "⊢", '⊣': "⊣", '⊤': "⊤", '⊥': "⊥", '⊧': "⊧", '⊨': "⊨",
'⊩': "⊩", '⊪': "⊪", '⊫': "⊫", '⊬': "⊬", '⊭': "⊭", '⊮': "⊮",
'⊯': "⊯", '⊰': "⊰", '⊲': "⊲", '⊳': "⊳", '⊴': "⊴", '⊵': "⊵", '⊶': "⊶",
'⊷': "⊷", '⊸': "⊸", '⊹': "⊹", '⊺': "⊺", '⊻': "⊻", '⊽': "⊽",
'⊾': "⊾", '⊿': "⊿", '⋀': "⋀", '⋁': "⋁", '⋂': "⋂", '⋃': "⋃", '⋄': "⋄",
'⋅': "⋅", '⋆': "⋆", '⋇': "⋇", '⋈': "⋈", '⋉': "⋉", '⋊': "⋊",
'⋋': "⋋", '⋌': "⋌", '⋍': "⋍", '⋎': "⋎", '⋏': "⋏", '⋐': "⋐", '⋑': "⋑",
'⋒': "⋒", '⋓': "⋓", '⋔': "⋔", '⋕': "⋕", '⋖': "⋖", '⋗': "⋗", '⋘': "⋘", '⋙': "⋙",
'⋚': "⋚", '⋛': "⋛", '⋞': "⋞", '⋟': "⋟", '⋠': "⋠", '⋡': "⋡", '⋢': "⋢",
'⋣': "⋣", '⋦': "⋦", '⋧': "⋧", '⋨': "⋨", '⋩': "⋩", '⋪': "⋪", '⋫': "⋫",
'⋬': "⋬", '⋭': "⋭", '⋮': "⋮", '⋯': "⋯", '⋰': "⋰", '⋱': "⋱", '⋲': "⋲",
'⋳': "⋳", '⋴': "⋴", '⋵': "⋵", '⋶': "⋶", '⋷': "⋷", '⋹': "⋹",
'⋺': "⋺", '⋻': "⋻", '⋼': "⋼", '⋽': "⋽", '⋾': "⋾", '⌅': "⌅", '⌆': "⌆",
'⌈': "⌈", '⌉': "⌉", '⌊': "⌊", '⌋': "⌋", '⌌': "⌌", '⌍': "⌍",
'⌎': "⌎", '⌏': "⌏", '⌐': "⌐", '⌒': "⌒", '⌓': "⌓", '⌕': "⌕",
'⌖': "⌖", '⌜': "⌜", '⌝': "⌝", '⌞': "⌞", '⌟': "⌟", '⌢': "⌢",
'⌣': "⌣", '⌭': "⌭", '⌮': "⌮", '⌶': "⌶", '⌽': "⌽", '⌿': "⌿",
'⍼': "⍼", '⎰': "⎰", '⎱': "⎱", '⎴': "⎴", '⎵': "⎵", '⎶': "⎶",
'⏜': "⏜", '⏝': "⏝", '⏞': "⏞", '⏟': "⏟", '⏢': "⏢",
'⏧': "⏧", '␣': "␣", 'Ⓢ': "Ⓢ", '─': "─", '│': "│", '┌': "┌", '┐': "┐",
'└': "└", '┘': "┘", '├': "├", '┤': "┤", '┬': "┬", '┴': "┴", '┼': "┼",
'═': "═", '║': "║", '╒': "╒", '╓': "╓", '╔': "╔", '╕': "╕", '╖': "╖",
'╗': "╗", '╘': "╘", '╙': "╙", '╚': "╚", '╛': "╛", '╜': "╜", '╝': "╝",
'╞': "╞", '╟': "╟", '╠': "╠", '╡': "╡", '╢': "╢", '╣': "╣", '╤': "╤",
'╥': "╥", '╦': "╦", '╧': "╧", '╨': "╨", '╩': "╩", '╪': "╪", '╫': "╫",
'╬': "╬", '▀': "▀", '▄': "▄", '█': "█", '░': "░", '▒': "▒", '▓': "▓",
'□': "□", '▪': "▪", '▫': "▫", '▭': "▭", '▮': "▮", '▱': "▱",
'△': "△", '▴': "▴", '▵': "▵", '▸': "▸", '▹': "▹", '▽': "▽", '▾': "▾",
'▿': "▿", '◂': "◂", '◃': "◃", '◊': "◊", '○': "○", '◬': "◬", '◯': "◯",
'◸': "◸", '◹': "◹", '◺': "◺", '◻': "◻", '◼': "◼",
'★': "★", '☆': "☆", '☎': "☎", '♀': "♀", '♂': "♂", '♠': "♠", '♣': "♣",
'♥': "♥", '♦': "♦", '♪': "♪", '♭': "♭", '♮': "♮", '♯': "♯", '✓': "✓",
'✗': "✗", '✠': "✠", '✶': "✶", '❘': "❘", '❲': "❲", '❳': "❳",
'⟦': "⟦", '⟧': "⟧", '⟨': "⟨", '⟩': "⟩", '⟪': "⟪", '⟫': "⟫", '⟬': "⟬",
'⟭': "⟭", '⟵': "⟵", '⟶': "⟶", '⟷': "⟷", '⟸': "⟸", '⟹': "⟹", '⟺': "⟺",
'⟼': "⟼", '⟿': "⟿", '⤂': "⤂", '⤃': "⤃", '⤄': "⤄", '⤅': "⤅", '⤌': "⤌",
'⤍': "⤍", '⤎': "⤎", '⤏': "⤏", '⤐': "⤐", '⤑': "⤑", '⤒': "⤒",
'⤓': "⤓", '⤖': "⤖", '⤙': "⤙", '⤚': "⤚", '⤛': "⤛", '⤜': "⤜",
'⤝': "⤝", '⤞': "⤞", '⤟': "⤟", '⤠': "⤠", '⤣': "⤣", '⤤': "⤤",
'⤥': "⤥", '⤦': "⤦", '⤧': "⤧", '⤨': "⤨", '⤩': "⤩", '⤪': "⤪",
'⤳': "⤳", '⤵': "⤵", '⤶': "⤶", '⤷': "⤷", '⤸': "⤸", '⤹': "⤹",
'⤼': "⤼", '⤽': "⤽", '⥅': "⥅", '⥈': "⥈", '⥉': "⥉", '⥊': "⥊",
'⥋': "⥋", '⥎': "⥎", '⥏': "⥏", '⥐': "⥐",
'⥑': "⥑", '⥒': "⥒", '⥓': "⥓", '⥔': "⥔",
'⥕': "⥕", '⥖': "⥖", '⥗': "⥗", '⥘': "⥘",
'⥙': "⥙", '⥚': "⥚", '⥛': "⥛", '⥜': "⥜",
'⥝': "⥝", '⥞': "⥞", '⥟': "⥟", '⥠': "⥠",
'⥡': "⥡", '⥢': "⥢", '⥣': "⥣", '⥤': "⥤", '⥥': "⥥", '⥦': "⥦",
'⥧': "⥧", '⥨': "⥨", '⥩': "⥩", '⥪': "⥪", '⥫': "⥫", '⥬': "⥬",
'⥭': "⥭", '⥮': "⥮", '⥯': "⥯", '⥰': "⥰", '⥱': "⥱", '⥲': "⥲",
'⥳': "⥳", '⥴': "⥴", '⥵': "⥵", '⥶': "⥶", '⥸': "⥸", '⥹': "⥹",
'⥻': "⥻", '⥼': "⥼", '⥽': "⥽", '⥾': "⥾", '⥿': "⥿", '⦅': "⦅",
'⦆': "⦆", '⦋': "⦋", '⦌': "⦌", '⦍': "⦍", '⦎': "⦎", '⦏': "⦏",
'⦐': "⦐", '⦑': "⦑", '⦒': "⦒", '⦓': "⦓", '⦔': "⦔", '⦕': "⦕",
'⦖': "⦖", '⦚': "⦚", '⦜': "⦜", '⦝': "⦝", '⦤': "⦤", '⦥': "⦥",
'⦦': "⦦", '⦧': "⦧", '⦨': "⦨", '⦩': "⦩", '⦪': "⦪", '⦫': "⦫",
'⦬': "⦬", '⦭': "⦭", '⦮': "⦮", '⦯': "⦯", '⦰': "⦰", '⦱': "⦱",
'⦲': "⦲", '⦳': "⦳", '⦴': "⦴", '⦵': "⦵", '⦶': "⦶", '⦷': "⦷",
'⦹': "⦹", '⦻': "⦻", '⦼': "⦼", '⦾': "⦾", '⦿': "⦿", '⧀': "⧀", '⧁': "⧁",
'⧂': "⧂", '⧃': "⧃", '⧄': "⧄", '⧅': "⧅", '⧉': "⧉", '⧍': "⧍", '⧎': "⧎",
'⧏': "⧏", '⧐': "⧐", '⧚': "∽̱", '⧜': "⧜", '⧝': "⧝",
'⧞': "⧞", '⧣': "⧣", '⧤': "⧤", '⧥': "⧥", '⧫': "⧫", '⧴': "⧴",
'⧶': "⧶", '⨀': "⨀", '⨁': "⨁", '⨂': "⨂", '⨄': "⨄", '⨆': "⨆", '⨌': "⨌",
'⨍': "⨍", '⨐': "⨐", '⨑': "⨑", '⨒': "⨒", '⨓': "⨓", '⨔': "⨔",
'⨕': "⨕", '⨖': "⨖", '⨗': "⨗", '⨢': "⨢", '⨣': "⨣", '⨤': "⨤",
'⨥': "⨥", '⨦': "⨦", '⨧': "⨧", '⨩': "⨩", '⨪': "⨪", '⨭': "⨭",
'⨮': "⨮", '⨯': "⨯", '⨰': "⨰", '⨱': "⨱", '⨳': "⨳", '⨴': "⨴",
'⨵': "⨵", '⨶': "⨶", '⨷': "⨷", '⨸': "⨸", '⨹': "⨹", '⨺': "⨺",
'⨻': "⨻", '⨼': "⨼", '⨿': "⨿", '⩀': "⩀", '⩂': "⩂", '⩃': "⩃", '⩄': "⩄",
'⩅': "⩅", '⩆': "⩆", '⩇': "⩇", '⩈': "⩈", '⩉': "⩉", '⩊': "⩊",
'⩋': "⩋", '⩌': "⩌", '⩍': "⩍", '⩐': "⩐", '⩓': "⩓", '⩔': "⩔", '⩕': "⩕",
'⩖': "⩖", '⩗': "⩗", '⩘': "⩘", '⩚': "⩚", '⩛': "⩛", '⩜': "⩜", '⩝': "⩝",
'⩟': "⩟", '⩦': "⩦", '⩪': "⩪", '⩭': "⩭", '⩮': "⩮", '⩯': "⩯", '⩰': "⩰",
'⩱': "⩱", '⩲': "⩲", '⩳': "⩳", '⩴': "⩴", '⩵': "⩵", '⩷': "⩷", '⩸': "⩸",
'⩹': "⩹", '⩺': "⩺", '⩻': "⩻", '⩼': "⩼", '⩽': "⩽", '⩾': "⩾", '⩿': "⩿",
'⪀': "⪀", '⪁': "⪁", '⪂': "⪂", '⪃': "⪃", '⪄': "⪄", '⪅': "⪅",
'⪆': "⪆", '⪇': "⪇", '⪈': "⪈", '⪉': "⪉", '⪊': "⪊", '⪋': "⪋", '⪌': "⪌", '⪍': "⪍",
'⪎': "⪎", '⪏': "⪏", '⪐': "⪐", '⪑': "⪑", '⪒': "⪒", '⪓': "⪓", '⪔': "⪔",
'⪕': "⪕", '⪖': "⪖", '⪗': "⪗", '⪘': "⪘", '⪙': "⪙", '⪚': "⪚", '⪝': "⪝",
'⪞': "⪞", '⪟': "⪟", '⪠': "⪠", '⪡': "⪡", '⪢': "⪢", '⪤': "⪤",
'⪥': "⪥", '⪦': "⪦", '⪧': "⪧", '⪨': "⪨", '⪩': "⪩", '⪪': "⪪", '⪫': "⪫",
'⪬': "⪬", '⪭': "⪭", '⪮': "⪮", '⪯': "⪯", '⪰': "⪰", '⪳': "⪳", '⪴': "⪴",
'⪵': "⪵", '⪶': "⪶", '⪷': "⪷", '⪸': "⪸", '⪹': "⪹", '⪺': "⪺", '⪻': "⪻",
'⪼': "⪼", '⪽': "⪽", '⪾': "⪾", '⪿': "⪿", '⫀': "⫀", '⫁': "⫁",
'⫂': "⫂", '⫃': "⫃", '⫄': "⫄", '⫅': "⫅", '⫆': "⫆", '⫇': "⫇",
'⫈': "⫈", '⫋': "⫋", '⫌': "⫌", '⫏': "⫏", '⫐': "⫐", '⫑': "⫑", '⫒': "⫒",
'⫓': "⫓", '⫔': "⫔", '⫕': "⫕", '⫖': "⫖", '⫗': "⫗", '⫘': "⫘",
'⫙': "⫙", '⫚': "⫚", '⫛': "⫛", '⫤': "⫤", '⫦': "⫦", '⫧': "⫧", '⫨': "⫨",
'⫩': "⫩", '⫫': "⫫", '⫬': "⫬", '⫭': "⫭", '⫮': "⫮", '⫯': "⫯", '⫰': "⫰",
'⫱': "⫱", '⫲': "⫲", '⫳': "⫳", '⫽': "⫽", 'ff': "ff", 'fi': "fi", 'fl': "fl",
'ffi': "ffi", 'ffl': "ffl", '𝒜': "𝒜", '𝒞': "𝒞", '𝒟': "𝒟", '𝒢': "𝒢", '𝒥': "𝒥",
'𝒦': "𝒦", '𝒩': "𝒩", '𝒪': "𝒪", '𝒫': "𝒫", '𝒬': "𝒬", '𝒮': "𝒮", '𝒯': "𝒯",
'𝒰': "𝒰", '𝒱': "𝒱", '𝒲': "𝒲", '𝒳': "𝒳", '𝒴': "𝒴", '𝒵': "𝒵", '𝒶': "𝒶",
'𝒷': "𝒷", '𝒸': "𝒸", '𝒹': "𝒹", '𝒻': "𝒻", '𝒽': "𝒽", '𝒾': "𝒾", '𝒿': "𝒿",
'𝓀': "𝓀", '𝓁': "𝓁", '𝓂': "𝓂", '𝓃': "𝓃", '𝓅': "𝓅", '𝓆': "𝓆", '𝓇': "𝓇",
'𝓈': "𝓈", '𝓉': "𝓉", '𝓊': "𝓊", '𝓋': "𝓋", '𝓌': "𝓌", '𝓍': "𝓍", '𝓎': "𝓎",
'𝓏': "𝓏", '𝔄': "𝔄", '𝔅': "𝔅", '𝔇': "𝔇", '𝔈': "𝔈", '𝔉': "𝔉", '𝔊': "𝔊", '𝔍': "𝔍",
'𝔎': "𝔎", '𝔏': "𝔏", '𝔐': "𝔐", '𝔑': "𝔑", '𝔒': "𝔒", '𝔓': "𝔓", '𝔔': "𝔔", '𝔖': "𝔖",
'𝔗': "𝔗", '𝔘': "𝔘", '𝔙': "𝔙", '𝔚': "𝔚", '𝔛': "𝔛", '𝔜': "𝔜", '𝔞': "𝔞", '𝔟': "𝔟",
'𝔠': "𝔠", '𝔡': "𝔡", '𝔢': "𝔢", '𝔣': "𝔣", '𝔤': "𝔤", '𝔥': "𝔥", '𝔦': "𝔦", '𝔧': "𝔧",
'𝔨': "𝔨", '𝔩': "𝔩", '𝔪': "𝔪", '𝔫': "𝔫", '𝔬': "𝔬", '𝔭': "𝔭", '𝔮': "𝔮", '𝔯': "𝔯",
'𝔰': "𝔰", '𝔱': "𝔱", '𝔲': "𝔲", '𝔳': "𝔳", '𝔴': "𝔴", '𝔵': "𝔵", '𝔶': "𝔶", '𝔷': "𝔷",
'𝔸': "𝔸", '𝔹': "𝔹", '𝔻': "𝔻", '𝔼': "𝔼", '𝔽': "𝔽", '𝔾': "𝔾", '𝕀': "𝕀",
'𝕁': "𝕁", '𝕂': "𝕂", '𝕃': "𝕃", '𝕄': "𝕄", '𝕆': "𝕆", '𝕊': "𝕊", '𝕋': "𝕋",
'𝕌': "𝕌", '𝕍': "𝕍", '𝕎': "𝕎", '𝕏': "𝕏", '𝕐': "𝕐", '𝕒': "𝕒", '𝕓': "𝕓",
'𝕔': "𝕔", '𝕕': "𝕕", '𝕖': "𝕖", '𝕗': "𝕗", '𝕘': "𝕘", '𝕙': "𝕙", '𝕚': "𝕚",
'𝕛': "𝕛", '𝕜': "𝕜", '𝕝': "𝕝", '𝕞': "𝕞", '𝕟': "𝕟", '𝕠': "𝕠", '𝕡': "𝕡",
'𝕢': "𝕢", '𝕣': "𝕣", '𝕤': "𝕤", '𝕥': "𝕥", '𝕦': "𝕦", '𝕧': "𝕧", '𝕨': "𝕨",
'𝕩': "𝕩", '𝕪': "𝕪", '𝕫': "𝕫",
}
DECMAP = {v: k for k, v in ENCMAP.items()}
class HtmlEntityDecodeError(ValueError):
pass
def htmlentity_encode(text, errors="strict"):
s = ""
for c in text:
try:
s += ENCMAP[c]
except KeyError:
i = ord(c)
s += "&" + hex(i)[2:].zfill(0) + ";" if i > 0xff else c
return s, len(text)
def htmlentity_decode(text, errors="strict"):
s = ""
i = 0
while i < len(text):
m = re.match(r"&(?:(?:[A-Za-z][A-Za-z0-9]{1,6}){1,4}|[0-9]{4});", text[i:i+30])
if m:
entity = m.group()
c = chr(int(entity[1:5], 16)) if entity[1:5].isdigit() and len(entity) == 6 else \
" " if entity == " " else None
if c:
s += c
else:
try:
s += DECMAP[entity]
except KeyError:
s += handle_error("html-entity", errors, HtmlEntityDecodeError, decode=True)(text[i], i)
i += len(entity)
else:
s += text[i]
i += 1
return s, len(text)
add("html", htmlentity_encode, htmlentity_decode, r"^html(?:[-_]?entit(?:y|ies))?$",
extra_exceptions=["HtmlEntityDecodeError"])