1from typing import Dict, List
2
3from .adobe_glyphs import adobe_glyphs
4from .pdfdoc import _pdfdoc_encoding
5from .std import _std_encoding
6from .symbol import _symbol_encoding
7from .zapfding import _zapfding_encoding
8
9
10def fill_from_encoding(enc: str) -> List[str]:
11 lst: List[str] = []
12 for x in range(256):
13 try:
14 lst += (bytes((x,)).decode(enc),)
15 except Exception:
16 lst += (chr(x),)
17 return lst
18
19
20def rev_encoding(enc: List[str]) -> Dict[str, int]:
21 rev: Dict[str, int] = {}
22 for i in range(256):
23 char = enc[i]
24 if char == "\u0000":
25 continue
26 assert char not in rev, f"{char} at {i} already at {rev[char]}"
27 rev[char] = i
28 return rev
29
30
31_win_encoding = fill_from_encoding("cp1252")
32_mac_encoding = fill_from_encoding("mac_roman")
33
34
35_win_encoding_rev: Dict[str, int] = rev_encoding(_win_encoding)
36_mac_encoding_rev: Dict[str, int] = rev_encoding(_mac_encoding)
37_symbol_encoding_rev: Dict[str, int] = rev_encoding(_symbol_encoding)
38_zapfding_encoding_rev: Dict[str, int] = rev_encoding(_zapfding_encoding)
39_pdfdoc_encoding_rev: Dict[str, int] = rev_encoding(_pdfdoc_encoding)
40
41
42charset_encoding: Dict[str, List[str]] = {
43 "/StandardEncoding": _std_encoding,
44 "/WinAnsiEncoding": _win_encoding,
45 "/MacRomanEncoding": _mac_encoding,
46 "/PDFDocEncoding": _pdfdoc_encoding,
47 "/Symbol": _symbol_encoding,
48 "/ZapfDingbats": _zapfding_encoding,
49}
50
51__all__ = [
52 "_mac_encoding",
53 "_pdfdoc_encoding",
54 "_pdfdoc_encoding_rev",
55 "_std_encoding",
56 "_symbol_encoding",
57 "_win_encoding",
58 "_zapfding_encoding",
59 "adobe_glyphs",
60 "charset_encoding",
61]