diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index 47887ea8..b79604cb 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -14,27 +14,8 @@ env: default-python: "3.10" jobs: - - check-code-formatting: - name: Check coding style - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - name: Set up Python ${{ env.default-python }} - uses: actions/setup-python@v4 - with: - python-version: ${{ env.default-python }} - - name: Upgrade pip, Install nox - run: | - python -m pip install --upgrade pip - python -m pip install nox - - name: Check coding style - run: | - nox --error-on-missing-interpreters --non-interactive --session format - check-coding-style: - name: Check coding style + name: Format and check coding style runs-on: ubuntu-latest steps: - name: Checkout code @@ -49,7 +30,7 @@ jobs: python -m pip install nox - name: Check coding style run: | - nox --error-on-missing-interpreters --non-interactive --session lint + nox --error-on-missing-interpreters --non-interactive --session format check-static-types: name: Check static types @@ -122,7 +103,6 @@ jobs: name: Publish to PyPi runs-on: ubuntu-latest needs: - - check-code-formatting - check-coding-style - check-static-types - tests diff --git a/.gitignore b/.gitignore index c1642e11..7f27b7ae 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,5 @@ Pipfile Pipfile.lock .noseids .vscode/ -pyproject.toml poetry.lock .eggs diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cf168bf..b743c35f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] +### Changed + +- Using absolute instead of relative imports ([[#995](https://github.com/pdfminer/pdfminer.six/pull/995)]) + ### Deprecated - The third argument (generation number) to `PDFObjRef` ([#972](https://github.com/pdfminer/pdfminer.six/pull/972)) diff --git a/fuzzing/extract_text_fuzzer.py b/fuzzing/extract_text_fuzzer.py index 219badb5..79fe6018 100644 --- a/fuzzing/extract_text_fuzzer.py +++ b/fuzzing/extract_text_fuzzer.py @@ -6,9 +6,9 @@ with atheris.instrument_imports(): from fuzzing.utils import ( - prepare_pdfminer_fuzzing, - is_valid_byte_stream, generate_layout_parameters, + is_valid_byte_stream, + prepare_pdfminer_fuzzing, ) from pdfminer.high_level import extract_text diff --git a/fuzzing/extract_text_to_fp_fuzzer.py b/fuzzing/extract_text_to_fp_fuzzer.py index 302062d9..cb1424fb 100644 --- a/fuzzing/extract_text_to_fp_fuzzer.py +++ b/fuzzing/extract_text_to_fp_fuzzer.py @@ -7,9 +7,9 @@ with atheris.instrument_imports(): from fuzzing.utils import ( - prepare_pdfminer_fuzzing, - is_valid_byte_stream, generate_layout_parameters, + is_valid_byte_stream, + prepare_pdfminer_fuzzing, ) from pdfminer.high_level import extract_text_to_fp from pdfminer.psexceptions import PSException diff --git a/fuzzing/fuzzed_data_provider.py b/fuzzing/fuzzed_data_provider.py index 1992fbab..55889eee 100644 --- a/fuzzing/fuzzed_data_provider.py +++ b/fuzzing/fuzzed_data_provider.py @@ -26,7 +26,10 @@ def ConsumeMemoryFile(self, all_data: bool = False) -> io.BytesIO: return io.BytesIO(self.ConsumeRandomBytes()) def ConsumeOptionalIntList( - self, max_count: int, min: int, max: int + self, + max_count: int, + min: int, + max: int, ) -> Optional[List[int]]: if self.ConsumeBool(): count = self.ConsumeIntInRange(0, max_count) diff --git a/fuzzing/page_extraction_fuzzer.py b/fuzzing/page_extraction_fuzzer.py index 435cdb69..fb91ad05 100755 --- a/fuzzing/page_extraction_fuzzer.py +++ b/fuzzing/page_extraction_fuzzer.py @@ -1,14 +1,15 @@ #!/usr/bin/env python3 -import atheris import sys +import atheris + from fuzzing.fuzzed_data_provider import PdfminerFuzzedDataProvider with atheris.instrument_imports(): from fuzzing.utils import ( - prepare_pdfminer_fuzzing, - is_valid_byte_stream, generate_layout_parameters, + is_valid_byte_stream, + prepare_pdfminer_fuzzing, ) from pdfminer.high_level import extract_pages from pdfminer.psexceptions import PSException @@ -29,7 +30,7 @@ def fuzz_one_input(data: bytes) -> None: maxpages=fdp.ConsumeIntInRange(0, 10), page_numbers=fdp.ConsumeOptionalIntList(10, 0, 10), laparams=generate_layout_parameters(fdp), - ) + ), ) except (AssertionError, PSException): return diff --git a/fuzzing/utils.py b/fuzzing/utils.py index 6c8e5a0f..9be29334 100644 --- a/fuzzing/utils.py +++ b/fuzzing/utils.py @@ -1,6 +1,5 @@ -""" -Utilities shared across the various PDF fuzzing harnesses -""" +"""Utilities shared across the various PDF fuzzing harnesses""" + import logging from typing import Optional @@ -12,9 +11,7 @@ def prepare_pdfminer_fuzzing() -> None: - """ - Used to disable logging of the pdfminer module - """ + """Used to disable logging of the pdfminer module""" logging.getLogger("pdfminer").setLevel(logging.CRITICAL) diff --git a/noxfile.py b/noxfile.py index 5c9aca14..56b514a4 100644 --- a/noxfile.py +++ b/noxfile.py @@ -2,25 +2,20 @@ import nox - PYTHON_ALL_VERSIONS = ["3.8", "3.9", "3.10", "3.11", "3.12"] PYTHON_MODULES = ["fuzzing", "pdfminer", "tools", "tests", "noxfile.py", "setup.py"] @nox.session def format(session): - session.install("black<23") + session.install("ruff==0.5.1") # Format files locally with black, but only check in cicd if "CI" in os.environ: - session.run("black", "--check", *PYTHON_MODULES) + session.run("ruff", "check") + session.run("ruff", "format", "--check") else: - session.run("black", *PYTHON_MODULES) - - -@nox.session -def lint(session): - session.install("flake8") - session.run("flake8", *PYTHON_MODULES, "--count", "--statistics") + session.run("ruff", "check", "--fix") + session.run("ruff", "format") @nox.session @@ -49,8 +44,20 @@ def docs(session): session.install("setuptools") session.install("-e", ".[docs]") session.run( - "python", "-m", "sphinx", "-b", "html", "docs/source", "docs/build/html" + "python", + "-m", + "sphinx", + "-b", + "html", + "docs/source", + "docs/build/html", ) session.run( - "python", "-m", "sphinx", "-b", "doctest", "docs/source", "docs/build/doctest" + "python", + "-m", + "sphinx", + "-b", + "doctest", + "docs/source", + "docs/build/doctest", ) diff --git a/pdfminer/__init__.py b/pdfminer/__init__.py index 5bd4d50a..e2a177ce 100644 --- a/pdfminer/__init__.py +++ b/pdfminer/__init__.py @@ -1,4 +1,4 @@ -from importlib.metadata import version, PackageNotFoundError +from importlib.metadata import PackageNotFoundError, version try: __version__ = version("pdfminer.six") diff --git a/pdfminer/_saslprep.py b/pdfminer/_saslprep.py index d56ca16b..18e2b733 100644 --- a/pdfminer/_saslprep.py +++ b/pdfminer/_saslprep.py @@ -21,10 +21,10 @@ __all__ = ["saslprep"] import stringprep -from typing import Callable, Tuple import unicodedata +from typing import Callable, Tuple -from .pdfexceptions import PDFValueError +from pdfminer.pdfexceptions import PDFValueError # RFC4013 section 2.3 prohibited output. _PROHIBITED: Tuple[Callable[[str], bool], ...] = ( @@ -66,7 +66,11 @@ def saslprep(data: str, prohibit_unassigned_code_points: bool = True) -> str: in_table_c12 = stringprep.in_table_c12 in_table_b1 = stringprep.in_table_b1 data = "".join( - ["\u0020" if in_table_c12(elt) else elt for elt in data if not in_table_b1(elt)] + [ + "\u0020" if in_table_c12(elt) else elt + for elt in data + if not in_table_b1(elt) + ], ) # RFC3454 section 2, step 2 - Normalize diff --git a/pdfminer/arcfour.py b/pdfminer/arcfour.py index a767667f..cc78e361 100644 --- a/pdfminer/arcfour.py +++ b/pdfminer/arcfour.py @@ -1,10 +1,9 @@ -""" Python implementation of Arcfour encryption algorithm. +"""Python implementation of Arcfour encryption algorithm. See https://en.wikipedia.org/wiki/RC4 This code is in the public domain. """ - from typing import Sequence diff --git a/pdfminer/ascii85.py b/pdfminer/ascii85.py index dbe3d2a2..233bc744 100644 --- a/pdfminer/ascii85.py +++ b/pdfminer/ascii85.py @@ -1,4 +1,4 @@ -""" Python implementation of ASCII85/ASCIIHex decoder (Adobe version). +"""Python implementation of ASCII85/ASCIIHex decoder (Adobe version). This code is in the public domain. @@ -10,8 +10,7 @@ # ascii85decode(data) def ascii85decode(data: bytes) -> bytes: - """ - In ASCII85 encoding, every four bytes are encoded with five ASCII + """In ASCII85 encoding, every four bytes are encoded with five ASCII letters, using 85 different types of characters (as 256**4 < 85**5). When the length of the original bytes is not a multiple of 4, a special rule is used for round up. @@ -24,7 +23,7 @@ def ascii85decode(data: bytes) -> bytes: out = b"" for i in iter(data): c = bytes((i,)) - if b"!" <= c and c <= b"u": + if c >= b"!" and c <= b"u": n += 1 b = b * 85 + (ord(c) - 33) if n == 5: @@ -48,8 +47,7 @@ def ascii85decode(data: bytes) -> bytes: def asciihexdecode(data: bytes) -> bytes: - """ - ASCIIHexDecode filter: PDFReference v1.4 section 3.3.1 + """ASCIIHexDecode filter: PDFReference v1.4 section 3.3.1 For each pair of ASCII hexadecimal digits (0-9 and A-F or a-f), the ASCIIHexDecode filter produces one byte of binary data. All white-space characters are ignored. A right angle bracket character (>) indicates diff --git a/pdfminer/casting.py b/pdfminer/casting.py index c73dfa6b..a8df21da 100644 --- a/pdfminer/casting.py +++ b/pdfminer/casting.py @@ -1,4 +1,4 @@ -from typing import Optional, Any +from typing import Any, Optional def safe_int(o: Any) -> Optional[int]: diff --git a/pdfminer/ccitt.py b/pdfminer/ccitt.py index 9a9ca6f2..d55cd7ef 100644 --- a/pdfminer/ccitt.py +++ b/pdfminer/ccitt.py @@ -25,7 +25,7 @@ cast, ) -from .pdfexceptions import PDFException, PDFValueError +from pdfminer.pdfexceptions import PDFException, PDFValueError def get_bytes(data: bytes) -> Iterator[int]: @@ -53,7 +53,7 @@ def add(cls, root: BitParserState, v: Union[int, str], bits: str) -> None: p: BitParserState = root b = None for i in range(len(bits)): - if 0 < i: + if i > 0: assert b is not None if p[b] is None: p[b] = [None, None] @@ -84,7 +84,6 @@ def _parse_bit(self, x: object) -> None: class CCITTG4Parser(BitParser): - MODE = [None, None] BitParser.add(MODE, 0, "1") BitParser.add(MODE, +1, "011") @@ -475,9 +474,7 @@ def _do_vertical(self, dx: int) -> None: if x1 == 0: if self._color == 1 and self._refline[x1] != self._color: break - elif x1 == len(self._refline): - break - elif ( + elif x1 == len(self._refline) or ( self._refline[x1 - 1] == self._color and self._refline[x1] != self._color ): @@ -501,9 +498,7 @@ def _do_pass(self) -> None: if x1 == 0: if self._color == 1 and self._refline[x1] != self._color: break - elif x1 == len(self._refline): - break - elif ( + elif x1 == len(self._refline) or ( self._refline[x1 - 1] == self._color and self._refline[x1] != self._color ): @@ -513,9 +508,7 @@ def _do_pass(self) -> None: if x1 == 0: if self._color == 0 and self._refline[x1] == self._color: break - elif x1 == len(self._refline): - break - elif ( + elif x1 == len(self._refline) or ( self._refline[x1 - 1] != self._color and self._refline[x1] == self._color ): @@ -550,7 +543,10 @@ def _do_uncompressed(self, bits: str) -> None: class CCITTFaxDecoder(CCITTG4Parser): def __init__( - self, width: int, bytealign: bool = False, reversed: bool = False + self, + width: int, + bytealign: bool = False, + reversed: bool = False, ) -> None: CCITTG4Parser.__init__(self, width, bytealign=bytealign) self.reversed = reversed @@ -563,7 +559,7 @@ def output_line(self, y: int, bits: Sequence[int]) -> None: arr = array.array("B", [0] * ((len(bits) + 7) // 8)) if self.reversed: bits = [1 - b for b in bits] - for (i, b) in enumerate(bits): + for i, b in enumerate(bits): if b: arr[i // 8] += (128, 64, 32, 16, 8, 4, 2, 1)[i % 8] self._buf += arr.tobytes() @@ -598,7 +594,7 @@ def __init__(self, width: int, bytealign: bool = False) -> None: self.img = pygame.Surface((self.width, 1000)) def output_line(self, y: int, bits: Sequence[int]) -> None: - for (x, b) in enumerate(bits): + for x, b in enumerate(bits): if b: self.img.set_at((x, y), (255, 255, 255)) else: diff --git a/pdfminer/cmapdb.py b/pdfminer/cmapdb.py index 3ee5ae92..87d9870e 100644 --- a/pdfminer/cmapdb.py +++ b/pdfminer/cmapdb.py @@ -1,4 +1,4 @@ -""" Adobe character mapping (CMap) support. +"""Adobe character mapping (CMap) support. CMaps provide the mapping between character codes and Unicode code-points to character ids (CIDs). @@ -25,23 +25,18 @@ List, MutableMapping, Optional, + Set, TextIO, Tuple, Union, cast, - Set, ) +from pdfminer.encodingdb import name2unicode from pdfminer.pdfexceptions import PDFException, PDFTypeError -from .encodingdb import name2unicode -from .psparser import KWD from pdfminer.psexceptions import PSEOF, PSSyntaxError -from .psparser import PSKeyword -from .psparser import PSLiteral -from .psparser import PSStackParser -from .psparser import literal_name -from .utils import choplist -from .utils import nunpack +from pdfminer.psparser import KWD, PSKeyword, PSLiteral, PSStackParser, literal_name +from pdfminer.utils import choplist, nunpack log = logging.getLogger(__name__) @@ -51,7 +46,6 @@ class CMapError(PDFException): class CMapBase: - debug = 0 def __init__(self, **kwargs: object) -> None: @@ -88,7 +82,7 @@ def use_cmap(self, cmap: CMapBase) -> None: assert isinstance(cmap, CMap), str(type(cmap)) def copy(dst: Dict[int, object], src: Dict[int, object]) -> None: - for (k, v) in src.items(): + for k, v in src.items(): if isinstance(v, dict): d: Dict[int, object] = {} dst[k] = d @@ -121,7 +115,7 @@ def dump( if code2cid is None: code2cid = self.code2cid code = () - for (k, v) in sorted(code2cid.items()): + for k, v in sorted(code2cid.items()): c = code + (k,) if isinstance(v, int): out.write("code %r = cid %d\n" % (c, v)) @@ -160,7 +154,7 @@ def get_unichr(self, cid: int) -> str: return self.cid2unichr[cid] def dump(self, out: TextIO = sys.stdout) -> None: - for (k, v) in sorted(self.cid2unichr.items()): + for k, v in sorted(self.cid2unichr.items()): out.write("cid %d = unicode %r\n" % (k, v)) @@ -174,7 +168,7 @@ def get_unichr(self, cid: int) -> str: class FileCMap(CMap): def add_code2cid(self, code: str, cid: int) -> None: assert isinstance(code, str) and isinstance(cid, int), str( - (type(code), type(cid)) + (type(code), type(cid)), ) d = self.code2cid for c in code[:-1]: @@ -205,7 +199,7 @@ def add_cid2unichr(self, cid: int, code: Union[PSLiteral, bytes, int]) -> None: raise PDFTypeError(code) # A0 = non-breaking space, some weird fonts can have a collision on a cid here. - if unichr == "\u00A0" and self.cid2unichr.get(cid) == " ": + if unichr == "\u00a0" and self.cid2unichr.get(cid) == " ": return self.cid2unichr[cid] = unichr @@ -229,7 +223,6 @@ def __init__(self, name: str, module: Any, vertical: bool) -> None: class CMapDB: - _cmap_cache: Dict[str, PyCMap] = {} _umap_cache: Dict[str, List[PyUnicodeMap]] = {} @@ -253,8 +246,7 @@ def _load_data(cls, name: str) -> Any: return type(str(name), (), pickle.loads(gzfile.read())) finally: gzfile.close() - else: - raise CMapDB.CMapNotFound(name) + raise CMapDB.CMapNotFound(name) @classmethod def get_cmap(cls, name: str) -> CMapBase: @@ -364,7 +356,7 @@ def do_keyword(self, pos: int, token: PSKeyword) -> None: if token is self.KEYWORD_ENDCIDRANGE: objs = [obj for (__, obj) in self.popall()] - for (start_byte, end_byte, cid) in choplist(3, objs): + for start_byte, end_byte, cid in choplist(3, objs): if not isinstance(start_byte, bytes): self._warn_once("The start object of begincidrange is not a byte.") continue @@ -377,7 +369,7 @@ def do_keyword(self, pos: int, token: PSKeyword) -> None: if len(start_byte) != len(end_byte): self._warn_once( "The start and end byte of begincidrange have " - "different lengths." + "different lengths.", ) continue start_prefix = start_byte[:-4] @@ -385,7 +377,7 @@ def do_keyword(self, pos: int, token: PSKeyword) -> None: if start_prefix != end_prefix: self._warn_once( "The prefix of the start and end byte of " - "begincidrange are not the same." + "begincidrange are not the same.", ) continue svar = start_byte[-4:] @@ -404,7 +396,7 @@ def do_keyword(self, pos: int, token: PSKeyword) -> None: if token is self.KEYWORD_ENDCIDCHAR: objs = [obj for (__, obj) in self.popall()] - for (cid, code) in choplist(2, objs): + for cid, code in choplist(2, objs): if isinstance(code, bytes) and isinstance(cid, int): self.cmap.add_cid2unichr(cid, code) return @@ -415,7 +407,7 @@ def do_keyword(self, pos: int, token: PSKeyword) -> None: if token is self.KEYWORD_ENDBFRANGE: objs = [obj for (__, obj) in self.popall()] - for (start_byte, end_byte, code) in choplist(3, objs): + for start_byte, end_byte, code in choplist(3, objs): if not isinstance(start_byte, bytes): self._warn_once("The start object is not a byte.") continue @@ -431,7 +423,7 @@ def do_keyword(self, pos: int, token: PSKeyword) -> None: if len(code) != end - start + 1: self._warn_once( "The difference between the start and end " - "offsets does not match the code length." + "offsets does not match the code length.", ) for cid, unicode_value in zip(range(start, end + 1), code): self.cmap.add_cid2unichr(cid, unicode_value) @@ -452,7 +444,7 @@ def do_keyword(self, pos: int, token: PSKeyword) -> None: if token is self.KEYWORD_ENDBFCHAR: objs = [obj for (__, obj) in self.popall()] - for (cid, code) in choplist(2, objs): + for cid, code in choplist(2, objs): if isinstance(cid, bytes) and isinstance(code, bytes): self.cmap.add_cid2unichr(nunpack(cid), code) return diff --git a/pdfminer/converter.py b/pdfminer/converter.py index f310387d..7563c7af 100644 --- a/pdfminer/converter.py +++ b/pdfminer/converter.py @@ -15,38 +15,48 @@ cast, ) +from pdfminer import utils +from pdfminer.image import ImageWriter +from pdfminer.layout import ( + LAParams, + LTAnno, + LTChar, + LTComponent, + LTContainer, + LTCurve, + LTFigure, + LTImage, + LTItem, + LTLayoutContainer, + LTLine, + LTPage, + LTRect, + LTText, + LTTextBox, + LTTextBoxVertical, + LTTextGroup, + LTTextLine, + TextGroupElement, +) from pdfminer.pdfcolor import PDFColorSpace -from . import utils -from .image import ImageWriter -from .layout import LAParams, LTComponent, TextGroupElement -from .layout import LTAnno -from .layout import LTChar -from .layout import LTContainer -from .layout import LTCurve -from .layout import LTFigure -from .layout import LTImage -from .layout import LTItem -from .layout import LTLayoutContainer -from .layout import LTLine -from .layout import LTPage -from .layout import LTRect -from .layout import LTText -from .layout import LTTextBox -from .layout import LTTextBoxVertical -from .layout import LTTextGroup -from .layout import LTTextLine -from .pdfdevice import PDFTextDevice -from .pdffont import PDFFont -from .pdffont import PDFUnicodeNotDefined -from .pdfinterp import PDFGraphicState, PDFResourceManager -from .pdfpage import PDFPage -from .pdftypes import PDFStream -from .pdfexceptions import PDFValueError -from .utils import AnyIO, Point, Matrix, Rect, PathSegment, make_compat_str -from .utils import apply_matrix_pt -from .utils import bbox2str -from .utils import enc -from .utils import mult_matrix +from pdfminer.pdfdevice import PDFTextDevice +from pdfminer.pdfexceptions import PDFValueError +from pdfminer.pdffont import PDFFont, PDFUnicodeNotDefined +from pdfminer.pdfinterp import PDFGraphicState, PDFResourceManager +from pdfminer.pdfpage import PDFPage +from pdfminer.pdftypes import PDFStream +from pdfminer.utils import ( + AnyIO, + Matrix, + PathSegment, + Point, + Rect, + apply_matrix_pt, + bbox2str, + enc, + make_compat_str, + mult_matrix, +) log = logging.getLogger(__name__) @@ -305,9 +315,7 @@ def _is_binary_stream(outfp: AnyIO) -> bool: return False elif isinstance(outfp, io.BytesIO): return True - elif isinstance(outfp, io.StringIO): - return False - elif isinstance(outfp, io.TextIOBase): + elif isinstance(outfp, io.StringIO) or isinstance(outfp, io.TextIOBase): return False return True @@ -404,7 +412,12 @@ def __init__( text_colors: Optional[Dict[str, str]] = None, ) -> None: PDFConverter.__init__( - self, rsrcmgr, outfp, codec=codec, pageno=pageno, laparams=laparams + self, + rsrcmgr, + outfp, + codec=codec, + pageno=pageno, + laparams=laparams, ) # write() assumes a codec for binary I/O, or no codec for text I/O. @@ -455,7 +468,7 @@ def write_header(self) -> None: def write_footer(self) -> None: page_links = [f'{i}' for i in range(1, self.pageno)] s = '
Page: %s
\n' % ", ".join( - page_links + page_links, ) self.write(s) self.write("\n") @@ -464,7 +477,13 @@ def write_text(self, text: str) -> None: self.write(enc(text)) def place_rect( - self, color: str, borderwidth: int, x: float, y: float, w: float, h: float + self, + color: str, + borderwidth: int, + x: float, + y: float, + w: float, + h: float, ) -> None: color2 = self.rect_colors.get(color) if color2 is not None: @@ -486,7 +505,13 @@ def place_border(self, color: str, borderwidth: int, item: LTComponent) -> None: self.place_rect(color, borderwidth, item.x0, item.y1, item.width, item.height) def place_image( - self, item: LTImage, borderwidth: int, x: float, y: float, w: float, h: float + self, + item: LTImage, + borderwidth: int, + x: float, + y: float, + w: float, + h: float, ) -> None: if self.imagewriter is not None: name = self.imagewriter.export_image(item) @@ -505,7 +530,12 @@ def place_image( self.write(s) def place_text( - self, color: str, text: str, x: float, y: float, size: float + self, + color: str, + text: str, + x: float, + y: float, + size: float, ) -> None: color2 = self.text_colors.get(color) if color2 is not None: @@ -566,7 +596,7 @@ def put_text(self, text: str, fontname: str, fontsize: float) -> None: fontname_without_subset_tag = fontname.split("+")[-1] self.write( '' - % (fontname_without_subset_tag, fontsize * self.scale * self.fontscale) + % (fontname_without_subset_tag, fontsize * self.scale * self.fontscale), ) self._font = font self.write_text(text) @@ -589,12 +619,10 @@ def render(item: LTItem) -> None: if self.showpageno: self.write( '
' - % ((self._yoffset - item.y1) * self.scale) + % ((self._yoffset - item.y1) * self.scale), ) self.write( - 'Page {}
\n'.format( - item.pageid, item.pageid - ) + f'Page {item.pageid}\n', ) for child in item: render(child) @@ -610,48 +638,54 @@ def render(item: LTItem) -> None: self.end_div("figure") elif isinstance(item, LTImage): self.place_image(item, 1, item.x0, item.y1, item.width, item.height) - else: - if self.layoutmode == "exact": - if isinstance(item, LTTextLine): - self.place_border("textline", 1, item) - for child in item: - render(child) - elif isinstance(item, LTTextBox): - self.place_border("textbox", 1, item) - self.place_text( - "textbox", str(item.index + 1), item.x0, item.y1, 20 - ) - for child in item: - render(child) - elif isinstance(item, LTChar): - self.place_border("char", 1, item) - self.place_text( - "char", item.get_text(), item.x0, item.y1, item.size - ) - else: - if isinstance(item, LTTextLine): - for child in item: - render(child) - if self.layoutmode != "loose": - self.put_newline() - elif isinstance(item, LTTextBox): - self.begin_div( - "textbox", - 1, - item.x0, - item.y1, - item.width, - item.height, - item.get_writing_mode(), - ) - for child in item: - render(child) - self.end_div("textbox") - elif isinstance(item, LTChar): - fontname = make_compat_str(item.fontname) - self.put_text(item.get_text(), fontname, item.size) - elif isinstance(item, LTText): - self.write_text(item.get_text()) + elif self.layoutmode == "exact": + if isinstance(item, LTTextLine): + self.place_border("textline", 1, item) + for child in item: + render(child) + elif isinstance(item, LTTextBox): + self.place_border("textbox", 1, item) + self.place_text( + "textbox", + str(item.index + 1), + item.x0, + item.y1, + 20, + ) + for child in item: + render(child) + elif isinstance(item, LTChar): + self.place_border("char", 1, item) + self.place_text( + "char", + item.get_text(), + item.x0, + item.y1, + item.size, + ) + elif isinstance(item, LTTextLine): + for child in item: + render(child) + if self.layoutmode != "loose": + self.put_newline() + elif isinstance(item, LTTextBox): + self.begin_div( + "textbox", + 1, + item.x0, + item.y1, + item.width, + item.height, + item.get_writing_mode(), + ) + for child in item: + render(child) + self.end_div("textbox") + elif isinstance(item, LTChar): + fontname = make_compat_str(item.fontname) + self.put_text(item.get_text(), fontname, item.size) + elif isinstance(item, LTText): + self.write_text(item.get_text()) render(ltpage) self._yoffset += self.pagemargin @@ -661,7 +695,6 @@ def close(self) -> None: class XMLConverter(PDFConverter[AnyIO]): - CONTROL = re.compile("[\x00-\x08\x0b-\x0c\x0e-\x1f]") def __init__( @@ -675,7 +708,12 @@ def __init__( stripcontrol: bool = False, ) -> None: PDFConverter.__init__( - self, rsrcmgr, outfp, codec=codec, pageno=pageno, laparams=laparams + self, + rsrcmgr, + outfp, + codec=codec, + pageno=pageno, + laparams=laparams, ) # write() assumes a codec for binary I/O, or no codec for text I/O. @@ -712,7 +750,7 @@ def show_group(item: LTItem) -> None: if isinstance(item, LTTextBox): self.write( '\n' - % (item.index, bbox2str(item.bbox)) + % (item.index, bbox2str(item.bbox)), ) elif isinstance(item, LTTextGroup): self.write('\n' % bbox2str(item.bbox)) @@ -757,9 +795,7 @@ def render(item: LTItem) -> None: ) self.write(s) elif isinstance(item, LTFigure): - s = '
\n'.format( - item.name, bbox2str(item.bbox) - ) + s = f'
\n' self.write(s) for child in item: render(child) @@ -804,11 +840,12 @@ def render(item: LTItem) -> None: name = self.imagewriter.export_image(item) self.write( '\n' - % (enc(name), item.width, item.height) + % (enc(name), item.width, item.height), ) else: self.write( - '\n' % (item.width, item.height) + '\n' + % (item.width, item.height), ) else: assert False, str(("Unhandled", item)) @@ -848,7 +885,12 @@ def __init__( stripcontrol: bool = False, ): PDFConverter.__init__( - self, rsrcmgr, outfp, codec=codec, pageno=pageno, laparams=laparams + self, + rsrcmgr, + outfp, + codec=codec, + pageno=pageno, + laparams=laparams, ) self.stripcontrol = stripcontrol self.within_chars = False @@ -874,24 +916,24 @@ def write_header(self) -> None: if self.codec: self.write( "\n" % self.codec + "xml:lang='en' lang='en' charset='%s'>\n" % self.codec, ) else: self.write( "\n" + "xml:lang='en' lang='en'>\n", ) self.write("\n") self.write("\n") self.write( - "\n" + "\n", ) self.write( - "\n" + "\n", ) self.write( " \n" + " content='ocr_page ocr_block ocr_line ocrx_word'/>\n", ) self.write("\n") self.write("\n") @@ -899,7 +941,7 @@ def write_header(self) -> None: def write_footer(self) -> None: self.write("\n") self.write( - "\n" + "\n", ) def write_text(self, text: str) -> None: @@ -928,7 +970,7 @@ def write_word(self) -> None: self.working_size, self.working_text.strip(), ) - ) + ), ) self.within_chars = False @@ -940,14 +982,14 @@ def render(item: LTItem) -> None: self.page_bbox = item.bbox self.write( "
\n" - % (item.pageid, self.bbox_repr(item.bbox)) + % (item.pageid, self.bbox_repr(item.bbox)), ) for child in item: render(child) self.write("
\n") elif isinstance(item, LTTextLine): self.write( - "" % (self.bbox_repr(item.bbox)) + "" % (self.bbox_repr(item.bbox)), ) for child_line in item: render(child_line) @@ -955,7 +997,7 @@ def render(item: LTItem) -> None: elif isinstance(item, LTTextBox): self.write( "
\n" - % (item.index, self.bbox_repr(item.bbox)) + % (item.index, self.bbox_repr(item.bbox)), ) for child in item: render(child) @@ -967,27 +1009,26 @@ def render(item: LTItem) -> None: self.working_bbox = item.bbox self.working_font = item.fontname self.working_size = item.size + elif len(item.get_text().strip()) == 0: + self.write_word() + self.write(item.get_text()) else: - if len(item.get_text().strip()) == 0: + if ( + self.working_bbox[1] != item.bbox[1] + or self.working_font != item.fontname + or self.working_size != item.size + ): self.write_word() - self.write(item.get_text()) - else: - if ( - self.working_bbox[1] != item.bbox[1] - or self.working_font != item.fontname - or self.working_size != item.size - ): - self.write_word() - self.working_bbox = item.bbox - self.working_font = item.fontname - self.working_size = item.size - self.working_text += item.get_text() - self.working_bbox = ( - self.working_bbox[0], - self.working_bbox[1], - item.bbox[2], - self.working_bbox[3], - ) + self.working_bbox = item.bbox + self.working_font = item.fontname + self.working_size = item.size + self.working_text += item.get_text() + self.working_bbox = ( + self.working_bbox[0], + self.working_bbox[1], + item.bbox[2], + self.working_bbox[3], + ) render(ltpage) diff --git a/pdfminer/data_structures.py b/pdfminer/data_structures.py index 6e3f985d..21861520 100644 --- a/pdfminer/data_structures.py +++ b/pdfminer/data_structures.py @@ -2,7 +2,7 @@ from pdfminer import settings from pdfminer.pdfparser import PDFSyntaxError -from pdfminer.pdftypes import list_value, int_value, dict_value +from pdfminer.pdftypes import dict_value, int_value, list_value from pdfminer.utils import choplist diff --git a/pdfminer/encodingdb.py b/pdfminer/encodingdb.py index 2a08935e..7a3baf1a 100644 --- a/pdfminer/encodingdb.py +++ b/pdfminer/encodingdb.py @@ -2,10 +2,10 @@ import re from typing import Dict, Iterable, Optional, cast -from .pdfexceptions import PDFKeyError -from .glyphlist import glyphname2unicode -from .latin_enc import ENCODING -from .psparser import PSLiteral +from pdfminer.glyphlist import glyphname2unicode +from pdfminer.latin_enc import ENCODING +from pdfminer.pdfexceptions import PDFKeyError +from pdfminer.psparser import PSLiteral HEXADECIMAL = re.compile(r"[0-9a-fA-F]+") @@ -29,7 +29,7 @@ def name2unicode(name: str) -> str: if not isinstance(name, str): raise PDFKeyError( 'Could not convert unicode name "%s" to character because ' - "it should be of type str but is of type %s" % (name, type(name)) + "it should be of type str but is of type %s" % (name, type(name)), ) name = name.split(".")[0] @@ -38,34 +38,33 @@ def name2unicode(name: str) -> str: if len(components) > 1: return "".join(map(name2unicode, components)) - else: - if name in glyphname2unicode: - return glyphname2unicode[name] + elif name in glyphname2unicode: + return glyphname2unicode[name] - elif name.startswith("uni"): - name_without_uni = name.strip("uni") + elif name.startswith("uni"): + name_without_uni = name.strip("uni") - if HEXADECIMAL.match(name_without_uni) and len(name_without_uni) % 4 == 0: - unicode_digits = [ - int(name_without_uni[i : i + 4], base=16) - for i in range(0, len(name_without_uni), 4) - ] - for digit in unicode_digits: - raise_key_error_for_invalid_unicode(digit) - characters = map(chr, unicode_digits) - return "".join(characters) + if HEXADECIMAL.match(name_without_uni) and len(name_without_uni) % 4 == 0: + unicode_digits = [ + int(name_without_uni[i : i + 4], base=16) + for i in range(0, len(name_without_uni), 4) + ] + for digit in unicode_digits: + raise_key_error_for_invalid_unicode(digit) + characters = map(chr, unicode_digits) + return "".join(characters) - elif name.startswith("u"): - name_without_u = name.strip("u") + elif name.startswith("u"): + name_without_u = name.strip("u") - if HEXADECIMAL.match(name_without_u) and 4 <= len(name_without_u) <= 6: - unicode_digit = int(name_without_u, base=16) - raise_key_error_for_invalid_unicode(unicode_digit) - return chr(unicode_digit) + if HEXADECIMAL.match(name_without_u) and 4 <= len(name_without_u) <= 6: + unicode_digit = int(name_without_u, base=16) + raise_key_error_for_invalid_unicode(unicode_digit) + return chr(unicode_digit) raise PDFKeyError( 'Could not convert unicode name "%s" to character because ' - "it does not match specification" % name + "it does not match specification" % name, ) @@ -78,17 +77,16 @@ def raise_key_error_for_invalid_unicode(unicode_digit: int) -> None: if 55295 < unicode_digit < 57344: raise PDFKeyError( "Unicode digit %d is invalid because " - "it is in the range D800 through DFFF" % unicode_digit + "it is in the range D800 through DFFF" % unicode_digit, ) class EncodingDB: - std2unicode: Dict[int, str] = {} mac2unicode: Dict[int, str] = {} win2unicode: Dict[int, str] = {} pdf2unicode: Dict[int, str] = {} - for (name, std, mac, win, pdf) in ENCODING: + for name, std, mac, win, pdf in ENCODING: c = name2unicode(name) if std: std2unicode[std] = c @@ -108,7 +106,9 @@ class EncodingDB: @classmethod def get_encoding( - cls, name: str, diff: Optional[Iterable[object]] = None + cls, + name: str, + diff: Optional[Iterable[object]] = None, ) -> Dict[int, str]: cid2unicode = cls.encodings.get(name, cls.std2unicode) if diff: diff --git a/pdfminer/fontmetrics.py b/pdfminer/fontmetrics.py index 72038a10..b6780b96 100644 --- a/pdfminer/fontmetrics.py +++ b/pdfminer/fontmetrics.py @@ -1,4 +1,4 @@ -""" Font metrics for the Adobe core 14 fonts. +"""Font metrics for the Adobe core 14 fonts. Font metrics are used to compute the boundary of each character written with a proportional font. @@ -65,7 +65,7 @@ def convert_font_metrics(path: str) -> None: props[k] = tuple(map(float, f[1:5])) print("# -*- python -*-") print("FONT_METRICS = {") - for (fontname, (props, chars)) in fonts.items(): + for fontname, (props, chars) in fonts.items(): print(f" {fontname!r}: {(props, chars)!r},") print("}") diff --git a/pdfminer/glyphlist.py b/pdfminer/glyphlist.py index a7b4d1fb..3dd71bd3 100644 --- a/pdfminer/glyphlist.py +++ b/pdfminer/glyphlist.py @@ -1,4 +1,4 @@ -""" Mappings from Adobe glyph names to Unicode characters. +"""Mappings from Adobe glyph names to Unicode characters. In some CMap tables, Adobe glyph names are used for specifying Unicode characters instead of using decimal/hex character code. @@ -76,225 +76,225 @@ def convert_glyphlist(path: str) -> None: (name, x) = line.split(";") codes = x.split(" ") print( - " {!r}: u'{}',".format(name, "".join("\\u%s" % code for code in codes)) + " {!r}: u'{}',".format(name, "".join("\\u%s" % code for code in codes)), ) glyphname2unicode = { "A": "\u0041", - "AE": "\u00C6", - "AEacute": "\u01FC", - "AEmacron": "\u01E2", - "AEsmall": "\uF7E6", - "Aacute": "\u00C1", - "Aacutesmall": "\uF7E1", + "AE": "\u00c6", + "AEacute": "\u01fc", + "AEmacron": "\u01e2", + "AEsmall": "\uf7e6", + "Aacute": "\u00c1", + "Aacutesmall": "\uf7e1", "Abreve": "\u0102", - "Abreveacute": "\u1EAE", - "Abrevecyrillic": "\u04D0", - "Abrevedotbelow": "\u1EB6", - "Abrevegrave": "\u1EB0", - "Abrevehookabove": "\u1EB2", - "Abrevetilde": "\u1EB4", - "Acaron": "\u01CD", - "Acircle": "\u24B6", - "Acircumflex": "\u00C2", - "Acircumflexacute": "\u1EA4", - "Acircumflexdotbelow": "\u1EAC", - "Acircumflexgrave": "\u1EA6", - "Acircumflexhookabove": "\u1EA8", - "Acircumflexsmall": "\uF7E2", - "Acircumflextilde": "\u1EAA", - "Acute": "\uF6C9", - "Acutesmall": "\uF7B4", + "Abreveacute": "\u1eae", + "Abrevecyrillic": "\u04d0", + "Abrevedotbelow": "\u1eb6", + "Abrevegrave": "\u1eb0", + "Abrevehookabove": "\u1eb2", + "Abrevetilde": "\u1eb4", + "Acaron": "\u01cd", + "Acircle": "\u24b6", + "Acircumflex": "\u00c2", + "Acircumflexacute": "\u1ea4", + "Acircumflexdotbelow": "\u1eac", + "Acircumflexgrave": "\u1ea6", + "Acircumflexhookabove": "\u1ea8", + "Acircumflexsmall": "\uf7e2", + "Acircumflextilde": "\u1eaa", + "Acute": "\uf6c9", + "Acutesmall": "\uf7b4", "Acyrillic": "\u0410", "Adblgrave": "\u0200", - "Adieresis": "\u00C4", - "Adieresiscyrillic": "\u04D2", - "Adieresismacron": "\u01DE", - "Adieresissmall": "\uF7E4", - "Adotbelow": "\u1EA0", - "Adotmacron": "\u01E0", - "Agrave": "\u00C0", - "Agravesmall": "\uF7E0", - "Ahookabove": "\u1EA2", - "Aiecyrillic": "\u04D4", + "Adieresis": "\u00c4", + "Adieresiscyrillic": "\u04d2", + "Adieresismacron": "\u01de", + "Adieresissmall": "\uf7e4", + "Adotbelow": "\u1ea0", + "Adotmacron": "\u01e0", + "Agrave": "\u00c0", + "Agravesmall": "\uf7e0", + "Ahookabove": "\u1ea2", + "Aiecyrillic": "\u04d4", "Ainvertedbreve": "\u0202", "Alpha": "\u0391", "Alphatonos": "\u0386", "Amacron": "\u0100", - "Amonospace": "\uFF21", + "Amonospace": "\uff21", "Aogonek": "\u0104", - "Aring": "\u00C5", - "Aringacute": "\u01FA", - "Aringbelow": "\u1E00", - "Aringsmall": "\uF7E5", - "Asmall": "\uF761", - "Atilde": "\u00C3", - "Atildesmall": "\uF7E3", + "Aring": "\u00c5", + "Aringacute": "\u01fa", + "Aringbelow": "\u1e00", + "Aringsmall": "\uf7e5", + "Asmall": "\uf761", + "Atilde": "\u00c3", + "Atildesmall": "\uf7e3", "Aybarmenian": "\u0531", "B": "\u0042", - "Bcircle": "\u24B7", - "Bdotaccent": "\u1E02", - "Bdotbelow": "\u1E04", + "Bcircle": "\u24b7", + "Bdotaccent": "\u1e02", + "Bdotbelow": "\u1e04", "Becyrillic": "\u0411", "Benarmenian": "\u0532", "Beta": "\u0392", "Bhook": "\u0181", - "Blinebelow": "\u1E06", - "Bmonospace": "\uFF22", - "Brevesmall": "\uF6F4", - "Bsmall": "\uF762", + "Blinebelow": "\u1e06", + "Bmonospace": "\uff22", + "Brevesmall": "\uf6f4", + "Bsmall": "\uf762", "Btopbar": "\u0182", "C": "\u0043", - "Caarmenian": "\u053E", + "Caarmenian": "\u053e", "Cacute": "\u0106", - "Caron": "\uF6CA", - "Caronsmall": "\uF6F5", - "Ccaron": "\u010C", - "Ccedilla": "\u00C7", - "Ccedillaacute": "\u1E08", - "Ccedillasmall": "\uF7E7", - "Ccircle": "\u24B8", + "Caron": "\uf6ca", + "Caronsmall": "\uf6f5", + "Ccaron": "\u010c", + "Ccedilla": "\u00c7", + "Ccedillaacute": "\u1e08", + "Ccedillasmall": "\uf7e7", + "Ccircle": "\u24b8", "Ccircumflex": "\u0108", - "Cdot": "\u010A", - "Cdotaccent": "\u010A", - "Cedillasmall": "\uF7B8", + "Cdot": "\u010a", + "Cdotaccent": "\u010a", + "Cedillasmall": "\uf7b8", "Chaarmenian": "\u0549", - "Cheabkhasiancyrillic": "\u04BC", + "Cheabkhasiancyrillic": "\u04bc", "Checyrillic": "\u0427", - "Chedescenderabkhasiancyrillic": "\u04BE", - "Chedescendercyrillic": "\u04B6", - "Chedieresiscyrillic": "\u04F4", + "Chedescenderabkhasiancyrillic": "\u04be", + "Chedescendercyrillic": "\u04b6", + "Chedieresiscyrillic": "\u04f4", "Cheharmenian": "\u0543", - "Chekhakassiancyrillic": "\u04CB", - "Cheverticalstrokecyrillic": "\u04B8", - "Chi": "\u03A7", + "Chekhakassiancyrillic": "\u04cb", + "Cheverticalstrokecyrillic": "\u04b8", + "Chi": "\u03a7", "Chook": "\u0187", - "Circumflexsmall": "\uF6F6", - "Cmonospace": "\uFF23", + "Circumflexsmall": "\uf6f6", + "Cmonospace": "\uff23", "Coarmenian": "\u0551", - "Csmall": "\uF763", + "Csmall": "\uf763", "D": "\u0044", - "DZ": "\u01F1", - "DZcaron": "\u01C4", + "DZ": "\u01f1", + "DZcaron": "\u01c4", "Daarmenian": "\u0534", "Dafrican": "\u0189", - "Dcaron": "\u010E", - "Dcedilla": "\u1E10", - "Dcircle": "\u24B9", - "Dcircumflexbelow": "\u1E12", + "Dcaron": "\u010e", + "Dcedilla": "\u1e10", + "Dcircle": "\u24b9", + "Dcircumflexbelow": "\u1e12", "Dcroat": "\u0110", - "Ddotaccent": "\u1E0A", - "Ddotbelow": "\u1E0C", + "Ddotaccent": "\u1e0a", + "Ddotbelow": "\u1e0c", "Decyrillic": "\u0414", - "Deicoptic": "\u03EE", + "Deicoptic": "\u03ee", "Delta": "\u2206", "Deltagreek": "\u0394", - "Dhook": "\u018A", - "Dieresis": "\uF6CB", - "DieresisAcute": "\uF6CC", - "DieresisGrave": "\uF6CD", - "Dieresissmall": "\uF7A8", - "Digammagreek": "\u03DC", + "Dhook": "\u018a", + "Dieresis": "\uf6cb", + "DieresisAcute": "\uf6cc", + "DieresisGrave": "\uf6cd", + "Dieresissmall": "\uf7a8", + "Digammagreek": "\u03dc", "Djecyrillic": "\u0402", - "Dlinebelow": "\u1E0E", - "Dmonospace": "\uFF24", - "Dotaccentsmall": "\uF6F7", + "Dlinebelow": "\u1e0e", + "Dmonospace": "\uff24", + "Dotaccentsmall": "\uf6f7", "Dslash": "\u0110", - "Dsmall": "\uF764", - "Dtopbar": "\u018B", - "Dz": "\u01F2", - "Dzcaron": "\u01C5", - "Dzeabkhasiancyrillic": "\u04E0", + "Dsmall": "\uf764", + "Dtopbar": "\u018b", + "Dz": "\u01f2", + "Dzcaron": "\u01c5", + "Dzeabkhasiancyrillic": "\u04e0", "Dzecyrillic": "\u0405", - "Dzhecyrillic": "\u040F", + "Dzhecyrillic": "\u040f", "E": "\u0045", - "Eacute": "\u00C9", - "Eacutesmall": "\uF7E9", + "Eacute": "\u00c9", + "Eacutesmall": "\uf7e9", "Ebreve": "\u0114", - "Ecaron": "\u011A", - "Ecedillabreve": "\u1E1C", + "Ecaron": "\u011a", + "Ecedillabreve": "\u1e1c", "Echarmenian": "\u0535", - "Ecircle": "\u24BA", - "Ecircumflex": "\u00CA", - "Ecircumflexacute": "\u1EBE", - "Ecircumflexbelow": "\u1E18", - "Ecircumflexdotbelow": "\u1EC6", - "Ecircumflexgrave": "\u1EC0", - "Ecircumflexhookabove": "\u1EC2", - "Ecircumflexsmall": "\uF7EA", - "Ecircumflextilde": "\u1EC4", + "Ecircle": "\u24ba", + "Ecircumflex": "\u00ca", + "Ecircumflexacute": "\u1ebe", + "Ecircumflexbelow": "\u1e18", + "Ecircumflexdotbelow": "\u1ec6", + "Ecircumflexgrave": "\u1ec0", + "Ecircumflexhookabove": "\u1ec2", + "Ecircumflexsmall": "\uf7ea", + "Ecircumflextilde": "\u1ec4", "Ecyrillic": "\u0404", "Edblgrave": "\u0204", - "Edieresis": "\u00CB", - "Edieresissmall": "\uF7EB", + "Edieresis": "\u00cb", + "Edieresissmall": "\uf7eb", "Edot": "\u0116", "Edotaccent": "\u0116", - "Edotbelow": "\u1EB8", + "Edotbelow": "\u1eb8", "Efcyrillic": "\u0424", - "Egrave": "\u00C8", - "Egravesmall": "\uF7E8", + "Egrave": "\u00c8", + "Egravesmall": "\uf7e8", "Eharmenian": "\u0537", - "Ehookabove": "\u1EBA", + "Ehookabove": "\u1eba", "Eightroman": "\u2167", "Einvertedbreve": "\u0206", "Eiotifiedcyrillic": "\u0464", - "Elcyrillic": "\u041B", - "Elevenroman": "\u216A", + "Elcyrillic": "\u041b", + "Elevenroman": "\u216a", "Emacron": "\u0112", - "Emacronacute": "\u1E16", - "Emacrongrave": "\u1E14", - "Emcyrillic": "\u041C", - "Emonospace": "\uFF25", - "Encyrillic": "\u041D", - "Endescendercyrillic": "\u04A2", - "Eng": "\u014A", - "Enghecyrillic": "\u04A4", - "Enhookcyrillic": "\u04C7", + "Emacronacute": "\u1e16", + "Emacrongrave": "\u1e14", + "Emcyrillic": "\u041c", + "Emonospace": "\uff25", + "Encyrillic": "\u041d", + "Endescendercyrillic": "\u04a2", + "Eng": "\u014a", + "Enghecyrillic": "\u04a4", + "Enhookcyrillic": "\u04c7", "Eogonek": "\u0118", "Eopen": "\u0190", "Epsilon": "\u0395", "Epsilontonos": "\u0388", "Ercyrillic": "\u0420", - "Ereversed": "\u018E", - "Ereversedcyrillic": "\u042D", + "Ereversed": "\u018e", + "Ereversedcyrillic": "\u042d", "Escyrillic": "\u0421", - "Esdescendercyrillic": "\u04AA", - "Esh": "\u01A9", - "Esmall": "\uF765", + "Esdescendercyrillic": "\u04aa", + "Esh": "\u01a9", + "Esmall": "\uf765", "Eta": "\u0397", "Etarmenian": "\u0538", "Etatonos": "\u0389", - "Eth": "\u00D0", - "Ethsmall": "\uF7F0", - "Etilde": "\u1EBC", - "Etildebelow": "\u1E1A", - "Euro": "\u20AC", - "Ezh": "\u01B7", - "Ezhcaron": "\u01EE", - "Ezhreversed": "\u01B8", + "Eth": "\u00d0", + "Ethsmall": "\uf7f0", + "Etilde": "\u1ebc", + "Etildebelow": "\u1e1a", + "Euro": "\u20ac", + "Ezh": "\u01b7", + "Ezhcaron": "\u01ee", + "Ezhreversed": "\u01b8", "F": "\u0046", - "Fcircle": "\u24BB", - "Fdotaccent": "\u1E1E", + "Fcircle": "\u24bb", + "Fdotaccent": "\u1e1e", "Feharmenian": "\u0556", - "Feicoptic": "\u03E4", + "Feicoptic": "\u03e4", "Fhook": "\u0191", "Fitacyrillic": "\u0472", "Fiveroman": "\u2164", - "Fmonospace": "\uFF26", + "Fmonospace": "\uff26", "Fourroman": "\u2163", - "Fsmall": "\uF766", + "Fsmall": "\uf766", "G": "\u0047", "GBsquare": "\u3387", - "Gacute": "\u01F4", + "Gacute": "\u01f4", "Gamma": "\u0393", "Gammaafrican": "\u0194", - "Gangiacoptic": "\u03EA", - "Gbreve": "\u011E", - "Gcaron": "\u01E6", + "Gangiacoptic": "\u03ea", + "Gbreve": "\u011e", + "Gcaron": "\u01e6", "Gcedilla": "\u0122", - "Gcircle": "\u24BC", - "Gcircumflex": "\u011C", + "Gcircle": "\u24bc", + "Gcircumflex": "\u011c", "Gcommaaccent": "\u0122", "Gdot": "\u0120", "Gdotaccent": "\u0120", @@ -306,289 +306,289 @@ def convert_glyphlist(path: str) -> None: "Ghook": "\u0193", "Gimarmenian": "\u0533", "Gjecyrillic": "\u0403", - "Gmacron": "\u1E20", - "Gmonospace": "\uFF27", - "Grave": "\uF6CE", - "Gravesmall": "\uF760", - "Gsmall": "\uF767", - "Gsmallhook": "\u029B", - "Gstroke": "\u01E4", + "Gmacron": "\u1e20", + "Gmonospace": "\uff27", + "Grave": "\uf6ce", + "Gravesmall": "\uf760", + "Gsmall": "\uf767", + "Gsmallhook": "\u029b", + "Gstroke": "\u01e4", "H": "\u0048", - "H18533": "\u25CF", - "H18543": "\u25AA", - "H18551": "\u25AB", - "H22073": "\u25A1", - "HPsquare": "\u33CB", - "Haabkhasiancyrillic": "\u04A8", - "Hadescendercyrillic": "\u04B2", - "Hardsigncyrillic": "\u042A", + "H18533": "\u25cf", + "H18543": "\u25aa", + "H18551": "\u25ab", + "H22073": "\u25a1", + "HPsquare": "\u33cb", + "Haabkhasiancyrillic": "\u04a8", + "Hadescendercyrillic": "\u04b2", + "Hardsigncyrillic": "\u042a", "Hbar": "\u0126", - "Hbrevebelow": "\u1E2A", - "Hcedilla": "\u1E28", - "Hcircle": "\u24BD", + "Hbrevebelow": "\u1e2a", + "Hcedilla": "\u1e28", + "Hcircle": "\u24bd", "Hcircumflex": "\u0124", - "Hdieresis": "\u1E26", - "Hdotaccent": "\u1E22", - "Hdotbelow": "\u1E24", - "Hmonospace": "\uFF28", + "Hdieresis": "\u1e26", + "Hdotaccent": "\u1e22", + "Hdotbelow": "\u1e24", + "Hmonospace": "\uff28", "Hoarmenian": "\u0540", - "Horicoptic": "\u03E8", - "Hsmall": "\uF768", - "Hungarumlaut": "\uF6CF", - "Hungarumlautsmall": "\uF6F8", + "Horicoptic": "\u03e8", + "Hsmall": "\uf768", + "Hungarumlaut": "\uf6cf", + "Hungarumlautsmall": "\uf6f8", "Hzsquare": "\u3390", "I": "\u0049", - "IAcyrillic": "\u042F", + "IAcyrillic": "\u042f", "IJ": "\u0132", - "IUcyrillic": "\u042E", - "Iacute": "\u00CD", - "Iacutesmall": "\uF7ED", - "Ibreve": "\u012C", - "Icaron": "\u01CF", - "Icircle": "\u24BE", - "Icircumflex": "\u00CE", - "Icircumflexsmall": "\uF7EE", + "IUcyrillic": "\u042e", + "Iacute": "\u00cd", + "Iacutesmall": "\uf7ed", + "Ibreve": "\u012c", + "Icaron": "\u01cf", + "Icircle": "\u24be", + "Icircumflex": "\u00ce", + "Icircumflexsmall": "\uf7ee", "Icyrillic": "\u0406", "Idblgrave": "\u0208", - "Idieresis": "\u00CF", - "Idieresisacute": "\u1E2E", - "Idieresiscyrillic": "\u04E4", - "Idieresissmall": "\uF7EF", + "Idieresis": "\u00cf", + "Idieresisacute": "\u1e2e", + "Idieresiscyrillic": "\u04e4", + "Idieresissmall": "\uf7ef", "Idot": "\u0130", "Idotaccent": "\u0130", - "Idotbelow": "\u1ECA", - "Iebrevecyrillic": "\u04D6", + "Idotbelow": "\u1eca", + "Iebrevecyrillic": "\u04d6", "Iecyrillic": "\u0415", "Ifraktur": "\u2111", - "Igrave": "\u00CC", - "Igravesmall": "\uF7EC", - "Ihookabove": "\u1EC8", + "Igrave": "\u00cc", + "Igravesmall": "\uf7ec", + "Ihookabove": "\u1ec8", "Iicyrillic": "\u0418", - "Iinvertedbreve": "\u020A", + "Iinvertedbreve": "\u020a", "Iishortcyrillic": "\u0419", - "Imacron": "\u012A", - "Imacroncyrillic": "\u04E2", - "Imonospace": "\uFF29", - "Iniarmenian": "\u053B", + "Imacron": "\u012a", + "Imacroncyrillic": "\u04e2", + "Imonospace": "\uff29", + "Iniarmenian": "\u053b", "Iocyrillic": "\u0401", - "Iogonek": "\u012E", + "Iogonek": "\u012e", "Iota": "\u0399", "Iotaafrican": "\u0196", - "Iotadieresis": "\u03AA", - "Iotatonos": "\u038A", - "Ismall": "\uF769", + "Iotadieresis": "\u03aa", + "Iotatonos": "\u038a", + "Ismall": "\uf769", "Istroke": "\u0197", "Itilde": "\u0128", - "Itildebelow": "\u1E2C", + "Itildebelow": "\u1e2c", "Izhitsacyrillic": "\u0474", "Izhitsadblgravecyrillic": "\u0476", - "J": "\u004A", + "J": "\u004a", "Jaarmenian": "\u0541", - "Jcircle": "\u24BF", + "Jcircle": "\u24bf", "Jcircumflex": "\u0134", "Jecyrillic": "\u0408", - "Jheharmenian": "\u054B", - "Jmonospace": "\uFF2A", - "Jsmall": "\uF76A", - "K": "\u004B", + "Jheharmenian": "\u054b", + "Jmonospace": "\uff2a", + "Jsmall": "\uf76a", + "K": "\u004b", "KBsquare": "\u3385", - "KKsquare": "\u33CD", - "Kabashkircyrillic": "\u04A0", - "Kacute": "\u1E30", - "Kacyrillic": "\u041A", - "Kadescendercyrillic": "\u049A", - "Kahookcyrillic": "\u04C3", - "Kappa": "\u039A", - "Kastrokecyrillic": "\u049E", - "Kaverticalstrokecyrillic": "\u049C", - "Kcaron": "\u01E8", + "KKsquare": "\u33cd", + "Kabashkircyrillic": "\u04a0", + "Kacute": "\u1e30", + "Kacyrillic": "\u041a", + "Kadescendercyrillic": "\u049a", + "Kahookcyrillic": "\u04c3", + "Kappa": "\u039a", + "Kastrokecyrillic": "\u049e", + "Kaverticalstrokecyrillic": "\u049c", + "Kcaron": "\u01e8", "Kcedilla": "\u0136", - "Kcircle": "\u24C0", + "Kcircle": "\u24c0", "Kcommaaccent": "\u0136", - "Kdotbelow": "\u1E32", + "Kdotbelow": "\u1e32", "Keharmenian": "\u0554", - "Kenarmenian": "\u053F", + "Kenarmenian": "\u053f", "Khacyrillic": "\u0425", - "Kheicoptic": "\u03E6", + "Kheicoptic": "\u03e6", "Khook": "\u0198", - "Kjecyrillic": "\u040C", - "Klinebelow": "\u1E34", - "Kmonospace": "\uFF2B", + "Kjecyrillic": "\u040c", + "Klinebelow": "\u1e34", + "Kmonospace": "\uff2b", "Koppacyrillic": "\u0480", - "Koppagreek": "\u03DE", - "Ksicyrillic": "\u046E", - "Ksmall": "\uF76B", - "L": "\u004C", - "LJ": "\u01C7", - "LL": "\uF6BF", + "Koppagreek": "\u03de", + "Ksicyrillic": "\u046e", + "Ksmall": "\uf76b", + "L": "\u004c", + "LJ": "\u01c7", + "LL": "\uf6bf", "Lacute": "\u0139", - "Lambda": "\u039B", - "Lcaron": "\u013D", - "Lcedilla": "\u013B", - "Lcircle": "\u24C1", - "Lcircumflexbelow": "\u1E3C", - "Lcommaaccent": "\u013B", - "Ldot": "\u013F", - "Ldotaccent": "\u013F", - "Ldotbelow": "\u1E36", - "Ldotbelowmacron": "\u1E38", - "Liwnarmenian": "\u053C", - "Lj": "\u01C8", + "Lambda": "\u039b", + "Lcaron": "\u013d", + "Lcedilla": "\u013b", + "Lcircle": "\u24c1", + "Lcircumflexbelow": "\u1e3c", + "Lcommaaccent": "\u013b", + "Ldot": "\u013f", + "Ldotaccent": "\u013f", + "Ldotbelow": "\u1e36", + "Ldotbelowmacron": "\u1e38", + "Liwnarmenian": "\u053c", + "Lj": "\u01c8", "Ljecyrillic": "\u0409", - "Llinebelow": "\u1E3A", - "Lmonospace": "\uFF2C", + "Llinebelow": "\u1e3a", + "Lmonospace": "\uff2c", "Lslash": "\u0141", - "Lslashsmall": "\uF6F9", - "Lsmall": "\uF76C", - "M": "\u004D", + "Lslashsmall": "\uf6f9", + "Lsmall": "\uf76c", + "M": "\u004d", "MBsquare": "\u3386", - "Macron": "\uF6D0", - "Macronsmall": "\uF7AF", - "Macute": "\u1E3E", - "Mcircle": "\u24C2", - "Mdotaccent": "\u1E40", - "Mdotbelow": "\u1E42", + "Macron": "\uf6d0", + "Macronsmall": "\uf7af", + "Macute": "\u1e3e", + "Mcircle": "\u24c2", + "Mdotaccent": "\u1e40", + "Mdotbelow": "\u1e42", "Menarmenian": "\u0544", - "Mmonospace": "\uFF2D", - "Msmall": "\uF76D", - "Mturned": "\u019C", - "Mu": "\u039C", - "N": "\u004E", - "NJ": "\u01CA", + "Mmonospace": "\uff2d", + "Msmall": "\uf76d", + "Mturned": "\u019c", + "Mu": "\u039c", + "N": "\u004e", + "NJ": "\u01ca", "Nacute": "\u0143", "Ncaron": "\u0147", "Ncedilla": "\u0145", - "Ncircle": "\u24C3", - "Ncircumflexbelow": "\u1E4A", + "Ncircle": "\u24c3", + "Ncircumflexbelow": "\u1e4a", "Ncommaaccent": "\u0145", - "Ndotaccent": "\u1E44", - "Ndotbelow": "\u1E46", - "Nhookleft": "\u019D", + "Ndotaccent": "\u1e44", + "Ndotbelow": "\u1e46", + "Nhookleft": "\u019d", "Nineroman": "\u2168", - "Nj": "\u01CB", - "Njecyrillic": "\u040A", - "Nlinebelow": "\u1E48", - "Nmonospace": "\uFF2E", + "Nj": "\u01cb", + "Njecyrillic": "\u040a", + "Nlinebelow": "\u1e48", + "Nmonospace": "\uff2e", "Nowarmenian": "\u0546", - "Nsmall": "\uF76E", - "Ntilde": "\u00D1", - "Ntildesmall": "\uF7F1", - "Nu": "\u039D", - "O": "\u004F", + "Nsmall": "\uf76e", + "Ntilde": "\u00d1", + "Ntildesmall": "\uf7f1", + "Nu": "\u039d", + "O": "\u004f", "OE": "\u0152", - "OEsmall": "\uF6FA", - "Oacute": "\u00D3", - "Oacutesmall": "\uF7F3", - "Obarredcyrillic": "\u04E8", - "Obarreddieresiscyrillic": "\u04EA", - "Obreve": "\u014E", - "Ocaron": "\u01D1", - "Ocenteredtilde": "\u019F", - "Ocircle": "\u24C4", - "Ocircumflex": "\u00D4", - "Ocircumflexacute": "\u1ED0", - "Ocircumflexdotbelow": "\u1ED8", - "Ocircumflexgrave": "\u1ED2", - "Ocircumflexhookabove": "\u1ED4", - "Ocircumflexsmall": "\uF7F4", - "Ocircumflextilde": "\u1ED6", - "Ocyrillic": "\u041E", + "OEsmall": "\uf6fa", + "Oacute": "\u00d3", + "Oacutesmall": "\uf7f3", + "Obarredcyrillic": "\u04e8", + "Obarreddieresiscyrillic": "\u04ea", + "Obreve": "\u014e", + "Ocaron": "\u01d1", + "Ocenteredtilde": "\u019f", + "Ocircle": "\u24c4", + "Ocircumflex": "\u00d4", + "Ocircumflexacute": "\u1ed0", + "Ocircumflexdotbelow": "\u1ed8", + "Ocircumflexgrave": "\u1ed2", + "Ocircumflexhookabove": "\u1ed4", + "Ocircumflexsmall": "\uf7f4", + "Ocircumflextilde": "\u1ed6", + "Ocyrillic": "\u041e", "Odblacute": "\u0150", - "Odblgrave": "\u020C", - "Odieresis": "\u00D6", - "Odieresiscyrillic": "\u04E6", - "Odieresissmall": "\uF7F6", - "Odotbelow": "\u1ECC", - "Ogoneksmall": "\uF6FB", - "Ograve": "\u00D2", - "Ogravesmall": "\uF7F2", + "Odblgrave": "\u020c", + "Odieresis": "\u00d6", + "Odieresiscyrillic": "\u04e6", + "Odieresissmall": "\uf7f6", + "Odotbelow": "\u1ecc", + "Ogoneksmall": "\uf6fb", + "Ograve": "\u00d2", + "Ogravesmall": "\uf7f2", "Oharmenian": "\u0555", "Ohm": "\u2126", - "Ohookabove": "\u1ECE", - "Ohorn": "\u01A0", - "Ohornacute": "\u1EDA", - "Ohorndotbelow": "\u1EE2", - "Ohorngrave": "\u1EDC", - "Ohornhookabove": "\u1EDE", - "Ohorntilde": "\u1EE0", + "Ohookabove": "\u1ece", + "Ohorn": "\u01a0", + "Ohornacute": "\u1eda", + "Ohorndotbelow": "\u1ee2", + "Ohorngrave": "\u1edc", + "Ohornhookabove": "\u1ede", + "Ohorntilde": "\u1ee0", "Ohungarumlaut": "\u0150", - "Oi": "\u01A2", - "Oinvertedbreve": "\u020E", - "Omacron": "\u014C", - "Omacronacute": "\u1E52", - "Omacrongrave": "\u1E50", + "Oi": "\u01a2", + "Oinvertedbreve": "\u020e", + "Omacron": "\u014c", + "Omacronacute": "\u1e52", + "Omacrongrave": "\u1e50", "Omega": "\u2126", "Omegacyrillic": "\u0460", - "Omegagreek": "\u03A9", - "Omegaroundcyrillic": "\u047A", - "Omegatitlocyrillic": "\u047C", - "Omegatonos": "\u038F", - "Omicron": "\u039F", - "Omicrontonos": "\u038C", - "Omonospace": "\uFF2F", + "Omegagreek": "\u03a9", + "Omegaroundcyrillic": "\u047a", + "Omegatitlocyrillic": "\u047c", + "Omegatonos": "\u038f", + "Omicron": "\u039f", + "Omicrontonos": "\u038c", + "Omonospace": "\uff2f", "Oneroman": "\u2160", - "Oogonek": "\u01EA", - "Oogonekmacron": "\u01EC", + "Oogonek": "\u01ea", + "Oogonekmacron": "\u01ec", "Oopen": "\u0186", - "Oslash": "\u00D8", - "Oslashacute": "\u01FE", - "Oslashsmall": "\uF7F8", - "Osmall": "\uF76F", - "Ostrokeacute": "\u01FE", - "Otcyrillic": "\u047E", - "Otilde": "\u00D5", - "Otildeacute": "\u1E4C", - "Otildedieresis": "\u1E4E", - "Otildesmall": "\uF7F5", + "Oslash": "\u00d8", + "Oslashacute": "\u01fe", + "Oslashsmall": "\uf7f8", + "Osmall": "\uf76f", + "Ostrokeacute": "\u01fe", + "Otcyrillic": "\u047e", + "Otilde": "\u00d5", + "Otildeacute": "\u1e4c", + "Otildedieresis": "\u1e4e", + "Otildesmall": "\uf7f5", "P": "\u0050", - "Pacute": "\u1E54", - "Pcircle": "\u24C5", - "Pdotaccent": "\u1E56", - "Pecyrillic": "\u041F", - "Peharmenian": "\u054A", - "Pemiddlehookcyrillic": "\u04A6", - "Phi": "\u03A6", - "Phook": "\u01A4", - "Pi": "\u03A0", + "Pacute": "\u1e54", + "Pcircle": "\u24c5", + "Pdotaccent": "\u1e56", + "Pecyrillic": "\u041f", + "Peharmenian": "\u054a", + "Pemiddlehookcyrillic": "\u04a6", + "Phi": "\u03a6", + "Phook": "\u01a4", + "Pi": "\u03a0", "Piwrarmenian": "\u0553", - "Pmonospace": "\uFF30", - "Psi": "\u03A8", + "Pmonospace": "\uff30", + "Psi": "\u03a8", "Psicyrillic": "\u0470", - "Psmall": "\uF770", + "Psmall": "\uf770", "Q": "\u0051", - "Qcircle": "\u24C6", - "Qmonospace": "\uFF31", - "Qsmall": "\uF771", + "Qcircle": "\u24c6", + "Qmonospace": "\uff31", + "Qsmall": "\uf771", "R": "\u0052", - "Raarmenian": "\u054C", + "Raarmenian": "\u054c", "Racute": "\u0154", "Rcaron": "\u0158", "Rcedilla": "\u0156", - "Rcircle": "\u24C7", + "Rcircle": "\u24c7", "Rcommaaccent": "\u0156", "Rdblgrave": "\u0210", - "Rdotaccent": "\u1E58", - "Rdotbelow": "\u1E5A", - "Rdotbelowmacron": "\u1E5C", + "Rdotaccent": "\u1e58", + "Rdotbelow": "\u1e5a", + "Rdotbelowmacron": "\u1e5c", "Reharmenian": "\u0550", - "Rfraktur": "\u211C", - "Rho": "\u03A1", - "Ringsmall": "\uF6FC", + "Rfraktur": "\u211c", + "Rho": "\u03a1", + "Ringsmall": "\uf6fc", "Rinvertedbreve": "\u0212", - "Rlinebelow": "\u1E5E", - "Rmonospace": "\uFF32", - "Rsmall": "\uF772", + "Rlinebelow": "\u1e5e", + "Rmonospace": "\uff32", + "Rsmall": "\uf772", "Rsmallinverted": "\u0281", - "Rsmallinvertedsuperior": "\u02B6", + "Rsmallinvertedsuperior": "\u02b6", "S": "\u0053", - "SF010000": "\u250C", + "SF010000": "\u250c", "SF020000": "\u2514", "SF030000": "\u2510", "SF040000": "\u2518", - "SF050000": "\u253C", - "SF060000": "\u252C", + "SF050000": "\u253c", + "SF060000": "\u252c", "SF070000": "\u2534", - "SF080000": "\u251C", + "SF080000": "\u251c", "SF090000": "\u2524", "SF100000": "\u2500", "SF110000": "\u2502", @@ -599,18 +599,18 @@ def convert_glyphlist(path: str) -> None: "SF230000": "\u2563", "SF240000": "\u2551", "SF250000": "\u2557", - "SF260000": "\u255D", - "SF270000": "\u255C", - "SF280000": "\u255B", - "SF360000": "\u255E", - "SF370000": "\u255F", - "SF380000": "\u255A", + "SF260000": "\u255d", + "SF270000": "\u255c", + "SF280000": "\u255b", + "SF360000": "\u255e", + "SF370000": "\u255f", + "SF380000": "\u255a", "SF390000": "\u2554", "SF400000": "\u2569", "SF410000": "\u2566", "SF420000": "\u2560", "SF430000": "\u2550", - "SF440000": "\u256C", + "SF440000": "\u256c", "SF450000": "\u2567", "SF460000": "\u2568", "SF470000": "\u2564", @@ -619,254 +619,254 @@ def convert_glyphlist(path: str) -> None: "SF500000": "\u2558", "SF510000": "\u2552", "SF520000": "\u2553", - "SF530000": "\u256B", - "SF540000": "\u256A", - "Sacute": "\u015A", - "Sacutedotaccent": "\u1E64", - "Sampigreek": "\u03E0", + "SF530000": "\u256b", + "SF540000": "\u256a", + "Sacute": "\u015a", + "Sacutedotaccent": "\u1e64", + "Sampigreek": "\u03e0", "Scaron": "\u0160", - "Scarondotaccent": "\u1E66", - "Scaronsmall": "\uF6FD", - "Scedilla": "\u015E", - "Schwa": "\u018F", - "Schwacyrillic": "\u04D8", - "Schwadieresiscyrillic": "\u04DA", - "Scircle": "\u24C8", - "Scircumflex": "\u015C", + "Scarondotaccent": "\u1e66", + "Scaronsmall": "\uf6fd", + "Scedilla": "\u015e", + "Schwa": "\u018f", + "Schwacyrillic": "\u04d8", + "Schwadieresiscyrillic": "\u04da", + "Scircle": "\u24c8", + "Scircumflex": "\u015c", "Scommaaccent": "\u0218", - "Sdotaccent": "\u1E60", - "Sdotbelow": "\u1E62", - "Sdotbelowdotaccent": "\u1E68", - "Seharmenian": "\u054D", + "Sdotaccent": "\u1e60", + "Sdotbelow": "\u1e62", + "Sdotbelowdotaccent": "\u1e68", + "Seharmenian": "\u054d", "Sevenroman": "\u2166", "Shaarmenian": "\u0547", "Shacyrillic": "\u0428", "Shchacyrillic": "\u0429", - "Sheicoptic": "\u03E2", - "Shhacyrillic": "\u04BA", - "Shimacoptic": "\u03EC", - "Sigma": "\u03A3", + "Sheicoptic": "\u03e2", + "Shhacyrillic": "\u04ba", + "Shimacoptic": "\u03ec", + "Sigma": "\u03a3", "Sixroman": "\u2165", - "Smonospace": "\uFF33", - "Softsigncyrillic": "\u042C", - "Ssmall": "\uF773", - "Stigmagreek": "\u03DA", + "Smonospace": "\uff33", + "Softsigncyrillic": "\u042c", + "Ssmall": "\uf773", + "Stigmagreek": "\u03da", "T": "\u0054", - "Tau": "\u03A4", + "Tau": "\u03a4", "Tbar": "\u0166", "Tcaron": "\u0164", "Tcedilla": "\u0162", - "Tcircle": "\u24C9", - "Tcircumflexbelow": "\u1E70", + "Tcircle": "\u24c9", + "Tcircumflexbelow": "\u1e70", "Tcommaaccent": "\u0162", - "Tdotaccent": "\u1E6A", - "Tdotbelow": "\u1E6C", + "Tdotaccent": "\u1e6a", + "Tdotbelow": "\u1e6c", "Tecyrillic": "\u0422", - "Tedescendercyrillic": "\u04AC", + "Tedescendercyrillic": "\u04ac", "Tenroman": "\u2169", - "Tetsecyrillic": "\u04B4", + "Tetsecyrillic": "\u04b4", "Theta": "\u0398", - "Thook": "\u01AC", - "Thorn": "\u00DE", - "Thornsmall": "\uF7FE", + "Thook": "\u01ac", + "Thorn": "\u00de", + "Thornsmall": "\uf7fe", "Threeroman": "\u2162", - "Tildesmall": "\uF6FE", - "Tiwnarmenian": "\u054F", - "Tlinebelow": "\u1E6E", - "Tmonospace": "\uFF34", + "Tildesmall": "\uf6fe", + "Tiwnarmenian": "\u054f", + "Tlinebelow": "\u1e6e", + "Tmonospace": "\uff34", "Toarmenian": "\u0539", - "Tonefive": "\u01BC", + "Tonefive": "\u01bc", "Tonesix": "\u0184", - "Tonetwo": "\u01A7", - "Tretroflexhook": "\u01AE", + "Tonetwo": "\u01a7", + "Tretroflexhook": "\u01ae", "Tsecyrillic": "\u0426", - "Tshecyrillic": "\u040B", - "Tsmall": "\uF774", - "Twelveroman": "\u216B", + "Tshecyrillic": "\u040b", + "Tsmall": "\uf774", + "Twelveroman": "\u216b", "Tworoman": "\u2161", "U": "\u0055", - "Uacute": "\u00DA", - "Uacutesmall": "\uF7FA", - "Ubreve": "\u016C", - "Ucaron": "\u01D3", - "Ucircle": "\u24CA", - "Ucircumflex": "\u00DB", - "Ucircumflexbelow": "\u1E76", - "Ucircumflexsmall": "\uF7FB", + "Uacute": "\u00da", + "Uacutesmall": "\uf7fa", + "Ubreve": "\u016c", + "Ucaron": "\u01d3", + "Ucircle": "\u24ca", + "Ucircumflex": "\u00db", + "Ucircumflexbelow": "\u1e76", + "Ucircumflexsmall": "\uf7fb", "Ucyrillic": "\u0423", "Udblacute": "\u0170", "Udblgrave": "\u0214", - "Udieresis": "\u00DC", - "Udieresisacute": "\u01D7", - "Udieresisbelow": "\u1E72", - "Udieresiscaron": "\u01D9", - "Udieresiscyrillic": "\u04F0", - "Udieresisgrave": "\u01DB", - "Udieresismacron": "\u01D5", - "Udieresissmall": "\uF7FC", - "Udotbelow": "\u1EE4", - "Ugrave": "\u00D9", - "Ugravesmall": "\uF7F9", - "Uhookabove": "\u1EE6", - "Uhorn": "\u01AF", - "Uhornacute": "\u1EE8", - "Uhorndotbelow": "\u1EF0", - "Uhorngrave": "\u1EEA", - "Uhornhookabove": "\u1EEC", - "Uhorntilde": "\u1EEE", + "Udieresis": "\u00dc", + "Udieresisacute": "\u01d7", + "Udieresisbelow": "\u1e72", + "Udieresiscaron": "\u01d9", + "Udieresiscyrillic": "\u04f0", + "Udieresisgrave": "\u01db", + "Udieresismacron": "\u01d5", + "Udieresissmall": "\uf7fc", + "Udotbelow": "\u1ee4", + "Ugrave": "\u00d9", + "Ugravesmall": "\uf7f9", + "Uhookabove": "\u1ee6", + "Uhorn": "\u01af", + "Uhornacute": "\u1ee8", + "Uhorndotbelow": "\u1ef0", + "Uhorngrave": "\u1eea", + "Uhornhookabove": "\u1eec", + "Uhorntilde": "\u1eee", "Uhungarumlaut": "\u0170", - "Uhungarumlautcyrillic": "\u04F2", + "Uhungarumlautcyrillic": "\u04f2", "Uinvertedbreve": "\u0216", "Ukcyrillic": "\u0478", - "Umacron": "\u016A", - "Umacroncyrillic": "\u04EE", - "Umacrondieresis": "\u1E7A", - "Umonospace": "\uFF35", + "Umacron": "\u016a", + "Umacroncyrillic": "\u04ee", + "Umacrondieresis": "\u1e7a", + "Umonospace": "\uff35", "Uogonek": "\u0172", - "Upsilon": "\u03A5", - "Upsilon1": "\u03D2", - "Upsilonacutehooksymbolgreek": "\u03D3", - "Upsilonafrican": "\u01B1", - "Upsilondieresis": "\u03AB", - "Upsilondieresishooksymbolgreek": "\u03D4", - "Upsilonhooksymbol": "\u03D2", - "Upsilontonos": "\u038E", - "Uring": "\u016E", - "Ushortcyrillic": "\u040E", - "Usmall": "\uF775", - "Ustraightcyrillic": "\u04AE", - "Ustraightstrokecyrillic": "\u04B0", + "Upsilon": "\u03a5", + "Upsilon1": "\u03d2", + "Upsilonacutehooksymbolgreek": "\u03d3", + "Upsilonafrican": "\u01b1", + "Upsilondieresis": "\u03ab", + "Upsilondieresishooksymbolgreek": "\u03d4", + "Upsilonhooksymbol": "\u03d2", + "Upsilontonos": "\u038e", + "Uring": "\u016e", + "Ushortcyrillic": "\u040e", + "Usmall": "\uf775", + "Ustraightcyrillic": "\u04ae", + "Ustraightstrokecyrillic": "\u04b0", "Utilde": "\u0168", - "Utildeacute": "\u1E78", - "Utildebelow": "\u1E74", + "Utildeacute": "\u1e78", + "Utildebelow": "\u1e74", "V": "\u0056", - "Vcircle": "\u24CB", - "Vdotbelow": "\u1E7E", + "Vcircle": "\u24cb", + "Vdotbelow": "\u1e7e", "Vecyrillic": "\u0412", - "Vewarmenian": "\u054E", - "Vhook": "\u01B2", - "Vmonospace": "\uFF36", + "Vewarmenian": "\u054e", + "Vhook": "\u01b2", + "Vmonospace": "\uff36", "Voarmenian": "\u0548", - "Vsmall": "\uF776", - "Vtilde": "\u1E7C", + "Vsmall": "\uf776", + "Vtilde": "\u1e7c", "W": "\u0057", - "Wacute": "\u1E82", - "Wcircle": "\u24CC", + "Wacute": "\u1e82", + "Wcircle": "\u24cc", "Wcircumflex": "\u0174", - "Wdieresis": "\u1E84", - "Wdotaccent": "\u1E86", - "Wdotbelow": "\u1E88", - "Wgrave": "\u1E80", - "Wmonospace": "\uFF37", - "Wsmall": "\uF777", + "Wdieresis": "\u1e84", + "Wdotaccent": "\u1e86", + "Wdotbelow": "\u1e88", + "Wgrave": "\u1e80", + "Wmonospace": "\uff37", + "Wsmall": "\uf777", "X": "\u0058", - "Xcircle": "\u24CD", - "Xdieresis": "\u1E8C", - "Xdotaccent": "\u1E8A", - "Xeharmenian": "\u053D", - "Xi": "\u039E", - "Xmonospace": "\uFF38", - "Xsmall": "\uF778", + "Xcircle": "\u24cd", + "Xdieresis": "\u1e8c", + "Xdotaccent": "\u1e8a", + "Xeharmenian": "\u053d", + "Xi": "\u039e", + "Xmonospace": "\uff38", + "Xsmall": "\uf778", "Y": "\u0059", - "Yacute": "\u00DD", - "Yacutesmall": "\uF7FD", + "Yacute": "\u00dd", + "Yacutesmall": "\uf7fd", "Yatcyrillic": "\u0462", - "Ycircle": "\u24CE", + "Ycircle": "\u24ce", "Ycircumflex": "\u0176", "Ydieresis": "\u0178", - "Ydieresissmall": "\uF7FF", - "Ydotaccent": "\u1E8E", - "Ydotbelow": "\u1EF4", - "Yericyrillic": "\u042B", - "Yerudieresiscyrillic": "\u04F8", - "Ygrave": "\u1EF2", - "Yhook": "\u01B3", - "Yhookabove": "\u1EF6", + "Ydieresissmall": "\uf7ff", + "Ydotaccent": "\u1e8e", + "Ydotbelow": "\u1ef4", + "Yericyrillic": "\u042b", + "Yerudieresiscyrillic": "\u04f8", + "Ygrave": "\u1ef2", + "Yhook": "\u01b3", + "Yhookabove": "\u1ef6", "Yiarmenian": "\u0545", "Yicyrillic": "\u0407", "Yiwnarmenian": "\u0552", - "Ymonospace": "\uFF39", - "Ysmall": "\uF779", - "Ytilde": "\u1EF8", - "Yusbigcyrillic": "\u046A", - "Yusbigiotifiedcyrillic": "\u046C", + "Ymonospace": "\uff39", + "Ysmall": "\uf779", + "Ytilde": "\u1ef8", + "Yusbigcyrillic": "\u046a", + "Yusbigiotifiedcyrillic": "\u046c", "Yuslittlecyrillic": "\u0466", "Yuslittleiotifiedcyrillic": "\u0468", - "Z": "\u005A", + "Z": "\u005a", "Zaarmenian": "\u0536", "Zacute": "\u0179", - "Zcaron": "\u017D", - "Zcaronsmall": "\uF6FF", - "Zcircle": "\u24CF", - "Zcircumflex": "\u1E90", - "Zdot": "\u017B", - "Zdotaccent": "\u017B", - "Zdotbelow": "\u1E92", + "Zcaron": "\u017d", + "Zcaronsmall": "\uf6ff", + "Zcircle": "\u24cf", + "Zcircumflex": "\u1e90", + "Zdot": "\u017b", + "Zdotaccent": "\u017b", + "Zdotbelow": "\u1e92", "Zecyrillic": "\u0417", "Zedescendercyrillic": "\u0498", - "Zedieresiscyrillic": "\u04DE", + "Zedieresiscyrillic": "\u04de", "Zeta": "\u0396", - "Zhearmenian": "\u053A", - "Zhebrevecyrillic": "\u04C1", + "Zhearmenian": "\u053a", + "Zhebrevecyrillic": "\u04c1", "Zhecyrillic": "\u0416", "Zhedescendercyrillic": "\u0496", - "Zhedieresiscyrillic": "\u04DC", - "Zlinebelow": "\u1E94", - "Zmonospace": "\uFF3A", - "Zsmall": "\uF77A", - "Zstroke": "\u01B5", + "Zhedieresiscyrillic": "\u04dc", + "Zlinebelow": "\u1e94", + "Zmonospace": "\uff3a", + "Zsmall": "\uf77a", + "Zstroke": "\u01b5", "a": "\u0061", "aabengali": "\u0986", - "aacute": "\u00E1", + "aacute": "\u00e1", "aadeva": "\u0906", - "aagujarati": "\u0A86", - "aagurmukhi": "\u0A06", - "aamatragurmukhi": "\u0A3E", + "aagujarati": "\u0a86", + "aagurmukhi": "\u0a06", + "aamatragurmukhi": "\u0a3e", "aarusquare": "\u3303", - "aavowelsignbengali": "\u09BE", - "aavowelsigndeva": "\u093E", - "aavowelsigngujarati": "\u0ABE", - "abbreviationmarkarmenian": "\u055F", + "aavowelsignbengali": "\u09be", + "aavowelsigndeva": "\u093e", + "aavowelsigngujarati": "\u0abe", + "abbreviationmarkarmenian": "\u055f", "abbreviationsigndeva": "\u0970", "abengali": "\u0985", - "abopomofo": "\u311A", + "abopomofo": "\u311a", "abreve": "\u0103", - "abreveacute": "\u1EAF", - "abrevecyrillic": "\u04D1", - "abrevedotbelow": "\u1EB7", - "abrevegrave": "\u1EB1", - "abrevehookabove": "\u1EB3", - "abrevetilde": "\u1EB5", - "acaron": "\u01CE", - "acircle": "\u24D0", - "acircumflex": "\u00E2", - "acircumflexacute": "\u1EA5", - "acircumflexdotbelow": "\u1EAD", - "acircumflexgrave": "\u1EA7", - "acircumflexhookabove": "\u1EA9", - "acircumflextilde": "\u1EAB", - "acute": "\u00B4", + "abreveacute": "\u1eaf", + "abrevecyrillic": "\u04d1", + "abrevedotbelow": "\u1eb7", + "abrevegrave": "\u1eb1", + "abrevehookabove": "\u1eb3", + "abrevetilde": "\u1eb5", + "acaron": "\u01ce", + "acircle": "\u24d0", + "acircumflex": "\u00e2", + "acircumflexacute": "\u1ea5", + "acircumflexdotbelow": "\u1ead", + "acircumflexgrave": "\u1ea7", + "acircumflexhookabove": "\u1ea9", + "acircumflextilde": "\u1eab", + "acute": "\u00b4", "acutebelowcmb": "\u0317", "acutecmb": "\u0301", "acutecomb": "\u0301", "acutedeva": "\u0954", - "acutelowmod": "\u02CF", + "acutelowmod": "\u02cf", "acutetonecmb": "\u0341", "acyrillic": "\u0430", "adblgrave": "\u0201", - "addakgurmukhi": "\u0A71", + "addakgurmukhi": "\u0a71", "adeva": "\u0905", - "adieresis": "\u00E4", - "adieresiscyrillic": "\u04D3", - "adieresismacron": "\u01DF", - "adotbelow": "\u1EA1", - "adotmacron": "\u01E1", - "ae": "\u00E6", - "aeacute": "\u01FD", + "adieresis": "\u00e4", + "adieresiscyrillic": "\u04d3", + "adieresismacron": "\u01df", + "adotbelow": "\u1ea1", + "adotmacron": "\u01e1", + "ae": "\u00e6", + "aeacute": "\u01fd", "aekorean": "\u3150", - "aemacron": "\u01E3", + "aemacron": "\u01e3", "afii00208": "\u2015", - "afii08941": "\u20A4", + "afii08941": "\u20a4", "afii10017": "\u0410", "afii10018": "\u0411", "afii10019": "\u0412", @@ -878,12 +878,12 @@ def convert_glyphlist(path: str) -> None: "afii10025": "\u0417", "afii10026": "\u0418", "afii10027": "\u0419", - "afii10028": "\u041A", - "afii10029": "\u041B", - "afii10030": "\u041C", - "afii10031": "\u041D", - "afii10032": "\u041E", - "afii10033": "\u041F", + "afii10028": "\u041a", + "afii10029": "\u041b", + "afii10030": "\u041c", + "afii10031": "\u041d", + "afii10032": "\u041e", + "afii10033": "\u041f", "afii10034": "\u0420", "afii10035": "\u0421", "afii10036": "\u0422", @@ -894,12 +894,12 @@ def convert_glyphlist(path: str) -> None: "afii10041": "\u0427", "afii10042": "\u0428", "afii10043": "\u0429", - "afii10044": "\u042A", - "afii10045": "\u042B", - "afii10046": "\u042C", - "afii10047": "\u042D", - "afii10048": "\u042E", - "afii10049": "\u042F", + "afii10044": "\u042a", + "afii10045": "\u042b", + "afii10046": "\u042c", + "afii10047": "\u042d", + "afii10048": "\u042e", + "afii10049": "\u042f", "afii10050": "\u0490", "afii10051": "\u0402", "afii10052": "\u0403", @@ -909,12 +909,12 @@ def convert_glyphlist(path: str) -> None: "afii10056": "\u0407", "afii10057": "\u0408", "afii10058": "\u0409", - "afii10059": "\u040A", - "afii10060": "\u040B", - "afii10061": "\u040C", - "afii10062": "\u040E", - "afii10063": "\uF6C4", - "afii10064": "\uF6C5", + "afii10059": "\u040a", + "afii10060": "\u040b", + "afii10061": "\u040c", + "afii10062": "\u040e", + "afii10063": "\uf6c4", + "afii10064": "\uf6c5", "afii10065": "\u0430", "afii10066": "\u0431", "afii10067": "\u0432", @@ -926,12 +926,12 @@ def convert_glyphlist(path: str) -> None: "afii10073": "\u0437", "afii10074": "\u0438", "afii10075": "\u0439", - "afii10076": "\u043A", - "afii10077": "\u043B", - "afii10078": "\u043C", - "afii10079": "\u043D", - "afii10080": "\u043E", - "afii10081": "\u043F", + "afii10076": "\u043a", + "afii10077": "\u043b", + "afii10078": "\u043c", + "afii10079": "\u043d", + "afii10080": "\u043e", + "afii10081": "\u043f", "afii10082": "\u0440", "afii10083": "\u0441", "afii10084": "\u0442", @@ -942,12 +942,12 @@ def convert_glyphlist(path: str) -> None: "afii10089": "\u0447", "afii10090": "\u0448", "afii10091": "\u0449", - "afii10092": "\u044A", - "afii10093": "\u044B", - "afii10094": "\u044C", - "afii10095": "\u044D", - "afii10096": "\u044E", - "afii10097": "\u044F", + "afii10092": "\u044a", + "afii10093": "\u044b", + "afii10094": "\u044c", + "afii10095": "\u044d", + "afii10096": "\u044e", + "afii10097": "\u044f", "afii10098": "\u0491", "afii10099": "\u0452", "afii10100": "\u0453", @@ -957,27 +957,27 @@ def convert_glyphlist(path: str) -> None: "afii10104": "\u0457", "afii10105": "\u0458", "afii10106": "\u0459", - "afii10107": "\u045A", - "afii10108": "\u045B", - "afii10109": "\u045C", - "afii10110": "\u045E", - "afii10145": "\u040F", + "afii10107": "\u045a", + "afii10108": "\u045b", + "afii10109": "\u045c", + "afii10110": "\u045e", + "afii10145": "\u040f", "afii10146": "\u0462", "afii10147": "\u0472", "afii10148": "\u0474", - "afii10192": "\uF6C6", - "afii10193": "\u045F", + "afii10192": "\uf6c6", + "afii10193": "\u045f", "afii10194": "\u0463", "afii10195": "\u0473", "afii10196": "\u0475", - "afii10831": "\uF6C7", - "afii10832": "\uF6C8", - "afii10846": "\u04D9", - "afii299": "\u200E", - "afii300": "\u200F", - "afii301": "\u200D", - "afii57381": "\u066A", - "afii57388": "\u060C", + "afii10831": "\uf6c7", + "afii10832": "\uf6c8", + "afii10846": "\u04d9", + "afii299": "\u200e", + "afii300": "\u200f", + "afii301": "\u200d", + "afii57381": "\u066a", + "afii57388": "\u060c", "afii57392": "\u0660", "afii57393": "\u0661", "afii57394": "\u0662", @@ -988,8 +988,8 @@ def convert_glyphlist(path: str) -> None: "afii57399": "\u0667", "afii57400": "\u0668", "afii57401": "\u0669", - "afii57403": "\u061B", - "afii57407": "\u061F", + "afii57403": "\u061b", + "afii57407": "\u061f", "afii57409": "\u0621", "afii57410": "\u0622", "afii57411": "\u0623", @@ -999,12 +999,12 @@ def convert_glyphlist(path: str) -> None: "afii57415": "\u0627", "afii57416": "\u0628", "afii57417": "\u0629", - "afii57418": "\u062A", - "afii57419": "\u062B", - "afii57420": "\u062C", - "afii57421": "\u062D", - "afii57422": "\u062E", - "afii57423": "\u062F", + "afii57418": "\u062a", + "afii57419": "\u062b", + "afii57420": "\u062c", + "afii57421": "\u062d", + "afii57422": "\u062e", + "afii57423": "\u062f", "afii57424": "\u0630", "afii57425": "\u0631", "afii57426": "\u0632", @@ -1015,7 +1015,7 @@ def convert_glyphlist(path: str) -> None: "afii57431": "\u0637", "afii57432": "\u0638", "afii57433": "\u0639", - "afii57434": "\u063A", + "afii57434": "\u063a", "afii57440": "\u0640", "afii57441": "\u0641", "afii57442": "\u0642", @@ -1025,1783 +1025,1783 @@ def convert_glyphlist(path: str) -> None: "afii57446": "\u0646", "afii57448": "\u0648", "afii57449": "\u0649", - "afii57450": "\u064A", - "afii57451": "\u064B", - "afii57452": "\u064C", - "afii57453": "\u064D", - "afii57454": "\u064E", - "afii57455": "\u064F", + "afii57450": "\u064a", + "afii57451": "\u064b", + "afii57452": "\u064c", + "afii57453": "\u064d", + "afii57454": "\u064e", + "afii57455": "\u064f", "afii57456": "\u0650", "afii57457": "\u0651", "afii57458": "\u0652", "afii57470": "\u0647", - "afii57505": "\u06A4", - "afii57506": "\u067E", + "afii57505": "\u06a4", + "afii57506": "\u067e", "afii57507": "\u0686", "afii57508": "\u0698", - "afii57509": "\u06AF", + "afii57509": "\u06af", "afii57511": "\u0679", "afii57512": "\u0688", "afii57513": "\u0691", - "afii57514": "\u06BA", - "afii57519": "\u06D2", - "afii57534": "\u06D5", - "afii57636": "\u20AA", - "afii57645": "\u05BE", - "afii57658": "\u05C3", - "afii57664": "\u05D0", - "afii57665": "\u05D1", - "afii57666": "\u05D2", - "afii57667": "\u05D3", - "afii57668": "\u05D4", - "afii57669": "\u05D5", - "afii57670": "\u05D6", - "afii57671": "\u05D7", - "afii57672": "\u05D8", - "afii57673": "\u05D9", - "afii57674": "\u05DA", - "afii57675": "\u05DB", - "afii57676": "\u05DC", - "afii57677": "\u05DD", - "afii57678": "\u05DE", - "afii57679": "\u05DF", - "afii57680": "\u05E0", - "afii57681": "\u05E1", - "afii57682": "\u05E2", - "afii57683": "\u05E3", - "afii57684": "\u05E4", - "afii57685": "\u05E5", - "afii57686": "\u05E6", - "afii57687": "\u05E7", - "afii57688": "\u05E8", - "afii57689": "\u05E9", - "afii57690": "\u05EA", - "afii57694": "\uFB2A", - "afii57695": "\uFB2B", - "afii57700": "\uFB4B", - "afii57705": "\uFB1F", - "afii57716": "\u05F0", - "afii57717": "\u05F1", - "afii57718": "\u05F2", - "afii57723": "\uFB35", - "afii57793": "\u05B4", - "afii57794": "\u05B5", - "afii57795": "\u05B6", - "afii57796": "\u05BB", - "afii57797": "\u05B8", - "afii57798": "\u05B7", - "afii57799": "\u05B0", - "afii57800": "\u05B2", - "afii57801": "\u05B1", - "afii57802": "\u05B3", - "afii57803": "\u05C2", - "afii57804": "\u05C1", - "afii57806": "\u05B9", - "afii57807": "\u05BC", - "afii57839": "\u05BD", - "afii57841": "\u05BF", - "afii57842": "\u05C0", - "afii57929": "\u02BC", + "afii57514": "\u06ba", + "afii57519": "\u06d2", + "afii57534": "\u06d5", + "afii57636": "\u20aa", + "afii57645": "\u05be", + "afii57658": "\u05c3", + "afii57664": "\u05d0", + "afii57665": "\u05d1", + "afii57666": "\u05d2", + "afii57667": "\u05d3", + "afii57668": "\u05d4", + "afii57669": "\u05d5", + "afii57670": "\u05d6", + "afii57671": "\u05d7", + "afii57672": "\u05d8", + "afii57673": "\u05d9", + "afii57674": "\u05da", + "afii57675": "\u05db", + "afii57676": "\u05dc", + "afii57677": "\u05dd", + "afii57678": "\u05de", + "afii57679": "\u05df", + "afii57680": "\u05e0", + "afii57681": "\u05e1", + "afii57682": "\u05e2", + "afii57683": "\u05e3", + "afii57684": "\u05e4", + "afii57685": "\u05e5", + "afii57686": "\u05e6", + "afii57687": "\u05e7", + "afii57688": "\u05e8", + "afii57689": "\u05e9", + "afii57690": "\u05ea", + "afii57694": "\ufb2a", + "afii57695": "\ufb2b", + "afii57700": "\ufb4b", + "afii57705": "\ufb1f", + "afii57716": "\u05f0", + "afii57717": "\u05f1", + "afii57718": "\u05f2", + "afii57723": "\ufb35", + "afii57793": "\u05b4", + "afii57794": "\u05b5", + "afii57795": "\u05b6", + "afii57796": "\u05bb", + "afii57797": "\u05b8", + "afii57798": "\u05b7", + "afii57799": "\u05b0", + "afii57800": "\u05b2", + "afii57801": "\u05b1", + "afii57802": "\u05b3", + "afii57803": "\u05c2", + "afii57804": "\u05c1", + "afii57806": "\u05b9", + "afii57807": "\u05bc", + "afii57839": "\u05bd", + "afii57841": "\u05bf", + "afii57842": "\u05c0", + "afii57929": "\u02bc", "afii61248": "\u2105", "afii61289": "\u2113", "afii61352": "\u2116", - "afii61573": "\u202C", - "afii61574": "\u202D", - "afii61575": "\u202E", - "afii61664": "\u200C", - "afii63167": "\u066D", - "afii64937": "\u02BD", - "agrave": "\u00E0", - "agujarati": "\u0A85", - "agurmukhi": "\u0A05", + "afii61573": "\u202c", + "afii61574": "\u202d", + "afii61575": "\u202e", + "afii61664": "\u200c", + "afii63167": "\u066d", + "afii64937": "\u02bd", + "agrave": "\u00e0", + "agujarati": "\u0a85", + "agurmukhi": "\u0a05", "ahiragana": "\u3042", - "ahookabove": "\u1EA3", + "ahookabove": "\u1ea3", "aibengali": "\u0990", - "aibopomofo": "\u311E", + "aibopomofo": "\u311e", "aideva": "\u0910", - "aiecyrillic": "\u04D5", - "aigujarati": "\u0A90", - "aigurmukhi": "\u0A10", - "aimatragurmukhi": "\u0A48", + "aiecyrillic": "\u04d5", + "aigujarati": "\u0a90", + "aigurmukhi": "\u0a10", + "aimatragurmukhi": "\u0a48", "ainarabic": "\u0639", - "ainfinalarabic": "\uFECA", - "aininitialarabic": "\uFECB", - "ainmedialarabic": "\uFECC", + "ainfinalarabic": "\ufeca", + "aininitialarabic": "\ufecb", + "ainmedialarabic": "\ufecc", "ainvertedbreve": "\u0203", - "aivowelsignbengali": "\u09C8", + "aivowelsignbengali": "\u09c8", "aivowelsigndeva": "\u0948", - "aivowelsigngujarati": "\u0AC8", - "akatakana": "\u30A2", - "akatakanahalfwidth": "\uFF71", - "akorean": "\u314F", - "alef": "\u05D0", + "aivowelsigngujarati": "\u0ac8", + "akatakana": "\u30a2", + "akatakanahalfwidth": "\uff71", + "akorean": "\u314f", + "alef": "\u05d0", "alefarabic": "\u0627", - "alefdageshhebrew": "\uFB30", - "aleffinalarabic": "\uFE8E", + "alefdageshhebrew": "\ufb30", + "aleffinalarabic": "\ufe8e", "alefhamzaabovearabic": "\u0623", - "alefhamzaabovefinalarabic": "\uFE84", + "alefhamzaabovefinalarabic": "\ufe84", "alefhamzabelowarabic": "\u0625", - "alefhamzabelowfinalarabic": "\uFE88", - "alefhebrew": "\u05D0", - "aleflamedhebrew": "\uFB4F", + "alefhamzabelowfinalarabic": "\ufe88", + "alefhebrew": "\u05d0", + "aleflamedhebrew": "\ufb4f", "alefmaddaabovearabic": "\u0622", - "alefmaddaabovefinalarabic": "\uFE82", + "alefmaddaabovefinalarabic": "\ufe82", "alefmaksuraarabic": "\u0649", - "alefmaksurafinalarabic": "\uFEF0", - "alefmaksurainitialarabic": "\uFEF3", - "alefmaksuramedialarabic": "\uFEF4", - "alefpatahhebrew": "\uFB2E", - "alefqamatshebrew": "\uFB2F", + "alefmaksurafinalarabic": "\ufef0", + "alefmaksurainitialarabic": "\ufef3", + "alefmaksuramedialarabic": "\ufef4", + "alefpatahhebrew": "\ufb2e", + "alefqamatshebrew": "\ufb2f", "aleph": "\u2135", - "allequal": "\u224C", - "alpha": "\u03B1", - "alphatonos": "\u03AC", + "allequal": "\u224c", + "alpha": "\u03b1", + "alphatonos": "\u03ac", "amacron": "\u0101", - "amonospace": "\uFF41", + "amonospace": "\uff41", "ampersand": "\u0026", - "ampersandmonospace": "\uFF06", - "ampersandsmall": "\uF726", - "amsquare": "\u33C2", + "ampersandmonospace": "\uff06", + "ampersandsmall": "\uf726", + "amsquare": "\u33c2", "anbopomofo": "\u3122", "angbopomofo": "\u3124", - "angkhankhuthai": "\u0E5A", + "angkhankhuthai": "\u0e5a", "angle": "\u2220", "anglebracketleft": "\u3008", - "anglebracketleftvertical": "\uFE3F", + "anglebracketleftvertical": "\ufe3f", "anglebracketright": "\u3009", - "anglebracketrightvertical": "\uFE40", + "anglebracketrightvertical": "\ufe40", "angleleft": "\u2329", - "angleright": "\u232A", - "angstrom": "\u212B", + "angleright": "\u232a", + "angstrom": "\u212b", "anoteleia": "\u0387", "anudattadeva": "\u0952", "anusvarabengali": "\u0982", "anusvaradeva": "\u0902", - "anusvaragujarati": "\u0A82", + "anusvaragujarati": "\u0a82", "aogonek": "\u0105", "apaatosquare": "\u3300", - "aparen": "\u249C", - "apostrophearmenian": "\u055A", - "apostrophemod": "\u02BC", - "apple": "\uF8FF", + "aparen": "\u249c", + "apostrophearmenian": "\u055a", + "apostrophemod": "\u02bc", + "apple": "\uf8ff", "approaches": "\u2250", "approxequal": "\u2248", "approxequalorimage": "\u2252", "approximatelyequal": "\u2245", - "araeaekorean": "\u318E", - "araeakorean": "\u318D", + "araeaekorean": "\u318e", + "araeakorean": "\u318d", "arc": "\u2312", - "arighthalfring": "\u1E9A", - "aring": "\u00E5", - "aringacute": "\u01FB", - "aringbelow": "\u1E01", + "arighthalfring": "\u1e9a", + "aring": "\u00e5", + "aringacute": "\u01fb", + "aringbelow": "\u1e01", "arrowboth": "\u2194", - "arrowdashdown": "\u21E3", - "arrowdashleft": "\u21E0", - "arrowdashright": "\u21E2", - "arrowdashup": "\u21E1", - "arrowdblboth": "\u21D4", - "arrowdbldown": "\u21D3", - "arrowdblleft": "\u21D0", - "arrowdblright": "\u21D2", - "arrowdblup": "\u21D1", + "arrowdashdown": "\u21e3", + "arrowdashleft": "\u21e0", + "arrowdashright": "\u21e2", + "arrowdashup": "\u21e1", + "arrowdblboth": "\u21d4", + "arrowdbldown": "\u21d3", + "arrowdblleft": "\u21d0", + "arrowdblright": "\u21d2", + "arrowdblup": "\u21d1", "arrowdown": "\u2193", "arrowdownleft": "\u2199", "arrowdownright": "\u2198", - "arrowdownwhite": "\u21E9", - "arrowheaddownmod": "\u02C5", - "arrowheadleftmod": "\u02C2", - "arrowheadrightmod": "\u02C3", - "arrowheadupmod": "\u02C4", - "arrowhorizex": "\uF8E7", + "arrowdownwhite": "\u21e9", + "arrowheaddownmod": "\u02c5", + "arrowheadleftmod": "\u02c2", + "arrowheadrightmod": "\u02c3", + "arrowheadupmod": "\u02c4", + "arrowhorizex": "\uf8e7", "arrowleft": "\u2190", - "arrowleftdbl": "\u21D0", - "arrowleftdblstroke": "\u21CD", - "arrowleftoverright": "\u21C6", - "arrowleftwhite": "\u21E6", + "arrowleftdbl": "\u21d0", + "arrowleftdblstroke": "\u21cd", + "arrowleftoverright": "\u21c6", + "arrowleftwhite": "\u21e6", "arrowright": "\u2192", - "arrowrightdblstroke": "\u21CF", - "arrowrightheavy": "\u279E", - "arrowrightoverleft": "\u21C4", - "arrowrightwhite": "\u21E8", - "arrowtableft": "\u21E4", - "arrowtabright": "\u21E5", + "arrowrightdblstroke": "\u21cf", + "arrowrightheavy": "\u279e", + "arrowrightoverleft": "\u21c4", + "arrowrightwhite": "\u21e8", + "arrowtableft": "\u21e4", + "arrowtabright": "\u21e5", "arrowup": "\u2191", "arrowupdn": "\u2195", - "arrowupdnbse": "\u21A8", - "arrowupdownbase": "\u21A8", + "arrowupdnbse": "\u21a8", + "arrowupdownbase": "\u21a8", "arrowupleft": "\u2196", - "arrowupleftofdown": "\u21C5", + "arrowupleftofdown": "\u21c5", "arrowupright": "\u2197", - "arrowupwhite": "\u21E7", - "arrowvertex": "\uF8E6", - "asciicircum": "\u005E", - "asciicircummonospace": "\uFF3E", - "asciitilde": "\u007E", - "asciitildemonospace": "\uFF5E", + "arrowupwhite": "\u21e7", + "arrowvertex": "\uf8e6", + "asciicircum": "\u005e", + "asciicircummonospace": "\uff3e", + "asciitilde": "\u007e", + "asciitildemonospace": "\uff5e", "ascript": "\u0251", "ascriptturned": "\u0252", "asmallhiragana": "\u3041", - "asmallkatakana": "\u30A1", - "asmallkatakanahalfwidth": "\uFF67", - "asterisk": "\u002A", - "asteriskaltonearabic": "\u066D", - "asteriskarabic": "\u066D", + "asmallkatakana": "\u30a1", + "asmallkatakanahalfwidth": "\uff67", + "asterisk": "\u002a", + "asteriskaltonearabic": "\u066d", + "asteriskarabic": "\u066d", "asteriskmath": "\u2217", - "asteriskmonospace": "\uFF0A", - "asterisksmall": "\uFE61", + "asteriskmonospace": "\uff0a", + "asterisksmall": "\ufe61", "asterism": "\u2042", - "asuperior": "\uF6E9", + "asuperior": "\uf6e9", "asymptoticallyequal": "\u2243", "at": "\u0040", - "atilde": "\u00E3", - "atmonospace": "\uFF20", - "atsmall": "\uFE6B", + "atilde": "\u00e3", + "atmonospace": "\uff20", + "atsmall": "\ufe6b", "aturned": "\u0250", "aubengali": "\u0994", "aubopomofo": "\u3120", "audeva": "\u0914", - "augujarati": "\u0A94", - "augurmukhi": "\u0A14", - "aulengthmarkbengali": "\u09D7", - "aumatragurmukhi": "\u0A4C", - "auvowelsignbengali": "\u09CC", - "auvowelsigndeva": "\u094C", - "auvowelsigngujarati": "\u0ACC", - "avagrahadeva": "\u093D", + "augujarati": "\u0a94", + "augurmukhi": "\u0a14", + "aulengthmarkbengali": "\u09d7", + "aumatragurmukhi": "\u0a4c", + "auvowelsignbengali": "\u09cc", + "auvowelsigndeva": "\u094c", + "auvowelsigngujarati": "\u0acc", + "avagrahadeva": "\u093d", "aybarmenian": "\u0561", - "ayin": "\u05E2", - "ayinaltonehebrew": "\uFB20", - "ayinhebrew": "\u05E2", + "ayin": "\u05e2", + "ayinaltonehebrew": "\ufb20", + "ayinhebrew": "\u05e2", "b": "\u0062", - "babengali": "\u09AC", - "backslash": "\u005C", - "backslashmonospace": "\uFF3C", - "badeva": "\u092C", - "bagujarati": "\u0AAC", - "bagurmukhi": "\u0A2C", + "babengali": "\u09ac", + "backslash": "\u005c", + "backslashmonospace": "\uff3c", + "badeva": "\u092c", + "bagujarati": "\u0aac", + "bagurmukhi": "\u0a2c", "bahiragana": "\u3070", - "bahtthai": "\u0E3F", - "bakatakana": "\u30D0", - "bar": "\u007C", - "barmonospace": "\uFF5C", + "bahtthai": "\u0e3f", + "bakatakana": "\u30d0", + "bar": "\u007c", + "barmonospace": "\uff5c", "bbopomofo": "\u3105", - "bcircle": "\u24D1", - "bdotaccent": "\u1E03", - "bdotbelow": "\u1E05", - "beamedsixteenthnotes": "\u266C", + "bcircle": "\u24d1", + "bdotaccent": "\u1e03", + "bdotbelow": "\u1e05", + "beamedsixteenthnotes": "\u266c", "because": "\u2235", "becyrillic": "\u0431", "beharabic": "\u0628", - "behfinalarabic": "\uFE90", - "behinitialarabic": "\uFE91", + "behfinalarabic": "\ufe90", + "behinitialarabic": "\ufe91", "behiragana": "\u3079", - "behmedialarabic": "\uFE92", - "behmeeminitialarabic": "\uFC9F", - "behmeemisolatedarabic": "\uFC08", - "behnoonfinalarabic": "\uFC6D", - "bekatakana": "\u30D9", + "behmedialarabic": "\ufe92", + "behmeeminitialarabic": "\ufc9f", + "behmeemisolatedarabic": "\ufc08", + "behnoonfinalarabic": "\ufc6d", + "bekatakana": "\u30d9", "benarmenian": "\u0562", - "bet": "\u05D1", - "beta": "\u03B2", - "betasymbolgreek": "\u03D0", - "betdagesh": "\uFB31", - "betdageshhebrew": "\uFB31", - "bethebrew": "\u05D1", - "betrafehebrew": "\uFB4C", - "bhabengali": "\u09AD", - "bhadeva": "\u092D", - "bhagujarati": "\u0AAD", - "bhagurmukhi": "\u0A2D", + "bet": "\u05d1", + "beta": "\u03b2", + "betasymbolgreek": "\u03d0", + "betdagesh": "\ufb31", + "betdageshhebrew": "\ufb31", + "bethebrew": "\u05d1", + "betrafehebrew": "\ufb4c", + "bhabengali": "\u09ad", + "bhadeva": "\u092d", + "bhagujarati": "\u0aad", + "bhagurmukhi": "\u0a2d", "bhook": "\u0253", "bihiragana": "\u3073", - "bikatakana": "\u30D3", + "bikatakana": "\u30d3", "bilabialclick": "\u0298", - "bindigurmukhi": "\u0A02", + "bindigurmukhi": "\u0a02", "birusquare": "\u3331", - "blackcircle": "\u25CF", - "blackdiamond": "\u25C6", - "blackdownpointingtriangle": "\u25BC", - "blackleftpointingpointer": "\u25C4", - "blackleftpointingtriangle": "\u25C0", + "blackcircle": "\u25cf", + "blackdiamond": "\u25c6", + "blackdownpointingtriangle": "\u25bc", + "blackleftpointingpointer": "\u25c4", + "blackleftpointingtriangle": "\u25c0", "blacklenticularbracketleft": "\u3010", - "blacklenticularbracketleftvertical": "\uFE3B", + "blacklenticularbracketleftvertical": "\ufe3b", "blacklenticularbracketright": "\u3011", - "blacklenticularbracketrightvertical": "\uFE3C", - "blacklowerlefttriangle": "\u25E3", - "blacklowerrighttriangle": "\u25E2", - "blackrectangle": "\u25AC", - "blackrightpointingpointer": "\u25BA", - "blackrightpointingtriangle": "\u25B6", - "blacksmallsquare": "\u25AA", - "blacksmilingface": "\u263B", - "blacksquare": "\u25A0", + "blacklenticularbracketrightvertical": "\ufe3c", + "blacklowerlefttriangle": "\u25e3", + "blacklowerrighttriangle": "\u25e2", + "blackrectangle": "\u25ac", + "blackrightpointingpointer": "\u25ba", + "blackrightpointingtriangle": "\u25b6", + "blacksmallsquare": "\u25aa", + "blacksmilingface": "\u263b", + "blacksquare": "\u25a0", "blackstar": "\u2605", - "blackupperlefttriangle": "\u25E4", - "blackupperrighttriangle": "\u25E5", - "blackuppointingsmalltriangle": "\u25B4", - "blackuppointingtriangle": "\u25B2", + "blackupperlefttriangle": "\u25e4", + "blackupperrighttriangle": "\u25e5", + "blackuppointingsmalltriangle": "\u25b4", + "blackuppointingtriangle": "\u25b2", "blank": "\u2423", - "blinebelow": "\u1E07", + "blinebelow": "\u1e07", "block": "\u2588", - "bmonospace": "\uFF42", - "bobaimaithai": "\u0E1A", - "bohiragana": "\u307C", - "bokatakana": "\u30DC", - "bparen": "\u249D", - "bqsquare": "\u33C3", - "braceex": "\uF8F4", - "braceleft": "\u007B", - "braceleftbt": "\uF8F3", - "braceleftmid": "\uF8F2", - "braceleftmonospace": "\uFF5B", - "braceleftsmall": "\uFE5B", - "bracelefttp": "\uF8F1", - "braceleftvertical": "\uFE37", - "braceright": "\u007D", - "bracerightbt": "\uF8FE", - "bracerightmid": "\uF8FD", - "bracerightmonospace": "\uFF5D", - "bracerightsmall": "\uFE5C", - "bracerighttp": "\uF8FC", - "bracerightvertical": "\uFE38", - "bracketleft": "\u005B", - "bracketleftbt": "\uF8F0", - "bracketleftex": "\uF8EF", - "bracketleftmonospace": "\uFF3B", - "bracketlefttp": "\uF8EE", - "bracketright": "\u005D", - "bracketrightbt": "\uF8FB", - "bracketrightex": "\uF8FA", - "bracketrightmonospace": "\uFF3D", - "bracketrighttp": "\uF8F9", - "breve": "\u02D8", - "brevebelowcmb": "\u032E", + "bmonospace": "\uff42", + "bobaimaithai": "\u0e1a", + "bohiragana": "\u307c", + "bokatakana": "\u30dc", + "bparen": "\u249d", + "bqsquare": "\u33c3", + "braceex": "\uf8f4", + "braceleft": "\u007b", + "braceleftbt": "\uf8f3", + "braceleftmid": "\uf8f2", + "braceleftmonospace": "\uff5b", + "braceleftsmall": "\ufe5b", + "bracelefttp": "\uf8f1", + "braceleftvertical": "\ufe37", + "braceright": "\u007d", + "bracerightbt": "\uf8fe", + "bracerightmid": "\uf8fd", + "bracerightmonospace": "\uff5d", + "bracerightsmall": "\ufe5c", + "bracerighttp": "\uf8fc", + "bracerightvertical": "\ufe38", + "bracketleft": "\u005b", + "bracketleftbt": "\uf8f0", + "bracketleftex": "\uf8ef", + "bracketleftmonospace": "\uff3b", + "bracketlefttp": "\uf8ee", + "bracketright": "\u005d", + "bracketrightbt": "\uf8fb", + "bracketrightex": "\uf8fa", + "bracketrightmonospace": "\uff3d", + "bracketrighttp": "\uf8f9", + "breve": "\u02d8", + "brevebelowcmb": "\u032e", "brevecmb": "\u0306", - "breveinvertedbelowcmb": "\u032F", + "breveinvertedbelowcmb": "\u032f", "breveinvertedcmb": "\u0311", "breveinverteddoublecmb": "\u0361", - "bridgebelowcmb": "\u032A", - "bridgeinvertedbelowcmb": "\u033A", - "brokenbar": "\u00A6", + "bridgebelowcmb": "\u032a", + "bridgeinvertedbelowcmb": "\u033a", + "brokenbar": "\u00a6", "bstroke": "\u0180", - "bsuperior": "\uF6EA", + "bsuperior": "\uf6ea", "btopbar": "\u0183", "buhiragana": "\u3076", - "bukatakana": "\u30D6", + "bukatakana": "\u30d6", "bullet": "\u2022", - "bulletinverse": "\u25D8", + "bulletinverse": "\u25d8", "bulletoperator": "\u2219", - "bullseye": "\u25CE", + "bullseye": "\u25ce", "c": "\u0063", - "caarmenian": "\u056E", - "cabengali": "\u099A", + "caarmenian": "\u056e", + "cabengali": "\u099a", "cacute": "\u0107", - "cadeva": "\u091A", - "cagujarati": "\u0A9A", - "cagurmukhi": "\u0A1A", + "cadeva": "\u091a", + "cagujarati": "\u0a9a", + "cagurmukhi": "\u0a1a", "calsquare": "\u3388", "candrabindubengali": "\u0981", "candrabinducmb": "\u0310", "candrabindudeva": "\u0901", - "candrabindugujarati": "\u0A81", - "capslock": "\u21EA", + "candrabindugujarati": "\u0a81", + "capslock": "\u21ea", "careof": "\u2105", - "caron": "\u02C7", - "caronbelowcmb": "\u032C", - "caroncmb": "\u030C", - "carriagereturn": "\u21B5", + "caron": "\u02c7", + "caronbelowcmb": "\u032c", + "caroncmb": "\u030c", + "carriagereturn": "\u21b5", "cbopomofo": "\u3118", - "ccaron": "\u010D", - "ccedilla": "\u00E7", - "ccedillaacute": "\u1E09", - "ccircle": "\u24D2", + "ccaron": "\u010d", + "ccedilla": "\u00e7", + "ccedillaacute": "\u1e09", + "ccircle": "\u24d2", "ccircumflex": "\u0109", "ccurl": "\u0255", - "cdot": "\u010B", - "cdotaccent": "\u010B", - "cdsquare": "\u33C5", - "cedilla": "\u00B8", + "cdot": "\u010b", + "cdotaccent": "\u010b", + "cdsquare": "\u33c5", + "cedilla": "\u00b8", "cedillacmb": "\u0327", - "cent": "\u00A2", + "cent": "\u00a2", "centigrade": "\u2103", - "centinferior": "\uF6DF", - "centmonospace": "\uFFE0", - "centoldstyle": "\uF7A2", - "centsuperior": "\uF6E0", + "centinferior": "\uf6df", + "centmonospace": "\uffe0", + "centoldstyle": "\uf7a2", + "centsuperior": "\uf6e0", "chaarmenian": "\u0579", - "chabengali": "\u099B", - "chadeva": "\u091B", - "chagujarati": "\u0A9B", - "chagurmukhi": "\u0A1B", + "chabengali": "\u099b", + "chadeva": "\u091b", + "chagujarati": "\u0a9b", + "chagurmukhi": "\u0a1b", "chbopomofo": "\u3114", - "cheabkhasiancyrillic": "\u04BD", + "cheabkhasiancyrillic": "\u04bd", "checkmark": "\u2713", "checyrillic": "\u0447", - "chedescenderabkhasiancyrillic": "\u04BF", - "chedescendercyrillic": "\u04B7", - "chedieresiscyrillic": "\u04F5", + "chedescenderabkhasiancyrillic": "\u04bf", + "chedescendercyrillic": "\u04b7", + "chedieresiscyrillic": "\u04f5", "cheharmenian": "\u0573", - "chekhakassiancyrillic": "\u04CC", - "cheverticalstrokecyrillic": "\u04B9", - "chi": "\u03C7", + "chekhakassiancyrillic": "\u04cc", + "cheverticalstrokecyrillic": "\u04b9", + "chi": "\u03c7", "chieuchacirclekorean": "\u3277", "chieuchaparenkorean": "\u3217", "chieuchcirclekorean": "\u3269", - "chieuchkorean": "\u314A", + "chieuchkorean": "\u314a", "chieuchparenkorean": "\u3209", - "chochangthai": "\u0E0A", - "chochanthai": "\u0E08", - "chochingthai": "\u0E09", - "chochoethai": "\u0E0C", + "chochangthai": "\u0e0a", + "chochanthai": "\u0e08", + "chochingthai": "\u0e09", + "chochoethai": "\u0e0c", "chook": "\u0188", "cieucacirclekorean": "\u3276", "cieucaparenkorean": "\u3216", "cieuccirclekorean": "\u3268", "cieuckorean": "\u3148", "cieucparenkorean": "\u3208", - "cieucuparenkorean": "\u321C", - "circle": "\u25CB", + "cieucuparenkorean": "\u321c", + "circle": "\u25cb", "circlemultiply": "\u2297", "circleot": "\u2299", "circleplus": "\u2295", "circlepostalmark": "\u3036", - "circlewithlefthalfblack": "\u25D0", - "circlewithrighthalfblack": "\u25D1", - "circumflex": "\u02C6", - "circumflexbelowcmb": "\u032D", + "circlewithlefthalfblack": "\u25d0", + "circlewithrighthalfblack": "\u25d1", + "circumflex": "\u02c6", + "circumflexbelowcmb": "\u032d", "circumflexcmb": "\u0302", "clear": "\u2327", - "clickalveolar": "\u01C2", - "clickdental": "\u01C0", - "clicklateral": "\u01C1", - "clickretroflex": "\u01C3", + "clickalveolar": "\u01c2", + "clickdental": "\u01c0", + "clicklateral": "\u01c1", + "clickretroflex": "\u01c3", "club": "\u2663", "clubsuitblack": "\u2663", "clubsuitwhite": "\u2667", - "cmcubedsquare": "\u33A4", - "cmonospace": "\uFF43", - "cmsquaredsquare": "\u33A0", + "cmcubedsquare": "\u33a4", + "cmonospace": "\uff43", + "cmsquaredsquare": "\u33a0", "coarmenian": "\u0581", - "colon": "\u003A", - "colonmonetary": "\u20A1", - "colonmonospace": "\uFF1A", - "colonsign": "\u20A1", - "colonsmall": "\uFE55", - "colontriangularhalfmod": "\u02D1", - "colontriangularmod": "\u02D0", - "comma": "\u002C", + "colon": "\u003a", + "colonmonetary": "\u20a1", + "colonmonospace": "\uff1a", + "colonsign": "\u20a1", + "colonsmall": "\ufe55", + "colontriangularhalfmod": "\u02d1", + "colontriangularmod": "\u02d0", + "comma": "\u002c", "commaabovecmb": "\u0313", "commaaboverightcmb": "\u0315", - "commaaccent": "\uF6C3", - "commaarabic": "\u060C", - "commaarmenian": "\u055D", - "commainferior": "\uF6E1", - "commamonospace": "\uFF0C", + "commaaccent": "\uf6c3", + "commaarabic": "\u060c", + "commaarmenian": "\u055d", + "commainferior": "\uf6e1", + "commamonospace": "\uff0c", "commareversedabovecmb": "\u0314", - "commareversedmod": "\u02BD", - "commasmall": "\uFE50", - "commasuperior": "\uF6E2", + "commareversedmod": "\u02bd", + "commasmall": "\ufe50", + "commasuperior": "\uf6e2", "commaturnedabovecmb": "\u0312", - "commaturnedmod": "\u02BB", - "compass": "\u263C", + "commaturnedmod": "\u02bb", + "compass": "\u263c", "congruent": "\u2245", - "contourintegral": "\u222E", + "contourintegral": "\u222e", "control": "\u2303", "controlACK": "\u0006", "controlBEL": "\u0007", "controlBS": "\u0008", "controlCAN": "\u0018", - "controlCR": "\u000D", + "controlCR": "\u000d", "controlDC1": "\u0011", "controlDC2": "\u0012", "controlDC3": "\u0013", "controlDC4": "\u0014", - "controlDEL": "\u007F", + "controlDEL": "\u007f", "controlDLE": "\u0010", "controlEM": "\u0019", "controlENQ": "\u0005", "controlEOT": "\u0004", - "controlESC": "\u001B", + "controlESC": "\u001b", "controlETB": "\u0017", "controlETX": "\u0003", - "controlFF": "\u000C", - "controlFS": "\u001C", - "controlGS": "\u001D", + "controlFF": "\u000c", + "controlFS": "\u001c", + "controlGS": "\u001d", "controlHT": "\u0009", - "controlLF": "\u000A", + "controlLF": "\u000a", "controlNAK": "\u0015", - "controlRS": "\u001E", - "controlSI": "\u000F", - "controlSO": "\u000E", + "controlRS": "\u001e", + "controlSI": "\u000f", + "controlSO": "\u000e", "controlSOT": "\u0002", "controlSTX": "\u0001", - "controlSUB": "\u001A", + "controlSUB": "\u001a", "controlSYN": "\u0016", - "controlUS": "\u001F", - "controlVT": "\u000B", - "copyright": "\u00A9", - "copyrightsans": "\uF8E9", - "copyrightserif": "\uF6D9", - "cornerbracketleft": "\u300C", - "cornerbracketlefthalfwidth": "\uFF62", - "cornerbracketleftvertical": "\uFE41", - "cornerbracketright": "\u300D", - "cornerbracketrighthalfwidth": "\uFF63", - "cornerbracketrightvertical": "\uFE42", - "corporationsquare": "\u337F", - "cosquare": "\u33C7", - "coverkgsquare": "\u33C6", - "cparen": "\u249E", - "cruzeiro": "\u20A2", + "controlUS": "\u001f", + "controlVT": "\u000b", + "copyright": "\u00a9", + "copyrightsans": "\uf8e9", + "copyrightserif": "\uf6d9", + "cornerbracketleft": "\u300c", + "cornerbracketlefthalfwidth": "\uff62", + "cornerbracketleftvertical": "\ufe41", + "cornerbracketright": "\u300d", + "cornerbracketrighthalfwidth": "\uff63", + "cornerbracketrightvertical": "\ufe42", + "corporationsquare": "\u337f", + "cosquare": "\u33c7", + "coverkgsquare": "\u33c6", + "cparen": "\u249e", + "cruzeiro": "\u20a2", "cstretched": "\u0297", - "curlyand": "\u22CF", - "curlyor": "\u22CE", - "currency": "\u00A4", - "cyrBreve": "\uF6D1", - "cyrFlex": "\uF6D2", - "cyrbreve": "\uF6D4", - "cyrflex": "\uF6D5", + "curlyand": "\u22cf", + "curlyor": "\u22ce", + "currency": "\u00a4", + "cyrBreve": "\uf6d1", + "cyrFlex": "\uf6d2", + "cyrbreve": "\uf6d4", + "cyrflex": "\uf6d5", "d": "\u0064", "daarmenian": "\u0564", - "dabengali": "\u09A6", + "dabengali": "\u09a6", "dadarabic": "\u0636", "dadeva": "\u0926", - "dadfinalarabic": "\uFEBE", - "dadinitialarabic": "\uFEBF", - "dadmedialarabic": "\uFEC0", - "dagesh": "\u05BC", - "dageshhebrew": "\u05BC", + "dadfinalarabic": "\ufebe", + "dadinitialarabic": "\ufebf", + "dadmedialarabic": "\ufec0", + "dagesh": "\u05bc", + "dageshhebrew": "\u05bc", "dagger": "\u2020", "daggerdbl": "\u2021", - "dagujarati": "\u0AA6", - "dagurmukhi": "\u0A26", + "dagujarati": "\u0aa6", + "dagurmukhi": "\u0a26", "dahiragana": "\u3060", - "dakatakana": "\u30C0", - "dalarabic": "\u062F", - "dalet": "\u05D3", - "daletdagesh": "\uFB33", - "daletdageshhebrew": "\uFB33", - "dalethatafpatah": "\u05D3\u05B2", - "dalethatafpatahhebrew": "\u05D3\u05B2", - "dalethatafsegol": "\u05D3\u05B1", - "dalethatafsegolhebrew": "\u05D3\u05B1", - "dalethebrew": "\u05D3", - "dalethiriq": "\u05D3\u05B4", - "dalethiriqhebrew": "\u05D3\u05B4", - "daletholam": "\u05D3\u05B9", - "daletholamhebrew": "\u05D3\u05B9", - "daletpatah": "\u05D3\u05B7", - "daletpatahhebrew": "\u05D3\u05B7", - "daletqamats": "\u05D3\u05B8", - "daletqamatshebrew": "\u05D3\u05B8", - "daletqubuts": "\u05D3\u05BB", - "daletqubutshebrew": "\u05D3\u05BB", - "daletsegol": "\u05D3\u05B6", - "daletsegolhebrew": "\u05D3\u05B6", - "daletsheva": "\u05D3\u05B0", - "daletshevahebrew": "\u05D3\u05B0", - "dalettsere": "\u05D3\u05B5", - "dalettserehebrew": "\u05D3\u05B5", - "dalfinalarabic": "\uFEAA", - "dammaarabic": "\u064F", - "dammalowarabic": "\u064F", - "dammatanaltonearabic": "\u064C", - "dammatanarabic": "\u064C", + "dakatakana": "\u30c0", + "dalarabic": "\u062f", + "dalet": "\u05d3", + "daletdagesh": "\ufb33", + "daletdageshhebrew": "\ufb33", + "dalethatafpatah": "\u05d3\u05b2", + "dalethatafpatahhebrew": "\u05d3\u05b2", + "dalethatafsegol": "\u05d3\u05b1", + "dalethatafsegolhebrew": "\u05d3\u05b1", + "dalethebrew": "\u05d3", + "dalethiriq": "\u05d3\u05b4", + "dalethiriqhebrew": "\u05d3\u05b4", + "daletholam": "\u05d3\u05b9", + "daletholamhebrew": "\u05d3\u05b9", + "daletpatah": "\u05d3\u05b7", + "daletpatahhebrew": "\u05d3\u05b7", + "daletqamats": "\u05d3\u05b8", + "daletqamatshebrew": "\u05d3\u05b8", + "daletqubuts": "\u05d3\u05bb", + "daletqubutshebrew": "\u05d3\u05bb", + "daletsegol": "\u05d3\u05b6", + "daletsegolhebrew": "\u05d3\u05b6", + "daletsheva": "\u05d3\u05b0", + "daletshevahebrew": "\u05d3\u05b0", + "dalettsere": "\u05d3\u05b5", + "dalettserehebrew": "\u05d3\u05b5", + "dalfinalarabic": "\ufeaa", + "dammaarabic": "\u064f", + "dammalowarabic": "\u064f", + "dammatanaltonearabic": "\u064c", + "dammatanarabic": "\u064c", "danda": "\u0964", - "dargahebrew": "\u05A7", - "dargalefthebrew": "\u05A7", + "dargahebrew": "\u05a7", + "dargalefthebrew": "\u05a7", "dasiapneumatacyrilliccmb": "\u0485", - "dblGrave": "\uF6D3", - "dblanglebracketleft": "\u300A", - "dblanglebracketleftvertical": "\uFE3D", - "dblanglebracketright": "\u300B", - "dblanglebracketrightvertical": "\uFE3E", - "dblarchinvertedbelowcmb": "\u032B", - "dblarrowleft": "\u21D4", - "dblarrowright": "\u21D2", + "dblGrave": "\uf6d3", + "dblanglebracketleft": "\u300a", + "dblanglebracketleftvertical": "\ufe3d", + "dblanglebracketright": "\u300b", + "dblanglebracketrightvertical": "\ufe3e", + "dblarchinvertedbelowcmb": "\u032b", + "dblarrowleft": "\u21d4", + "dblarrowright": "\u21d2", "dbldanda": "\u0965", - "dblgrave": "\uF6D6", - "dblgravecmb": "\u030F", - "dblintegral": "\u222C", + "dblgrave": "\uf6d6", + "dblgravecmb": "\u030f", + "dblintegral": "\u222c", "dbllowline": "\u2017", "dbllowlinecmb": "\u0333", - "dbloverlinecmb": "\u033F", - "dblprimemod": "\u02BA", + "dbloverlinecmb": "\u033f", + "dblprimemod": "\u02ba", "dblverticalbar": "\u2016", - "dblverticallineabovecmb": "\u030E", + "dblverticallineabovecmb": "\u030e", "dbopomofo": "\u3109", - "dbsquare": "\u33C8", - "dcaron": "\u010F", - "dcedilla": "\u1E11", - "dcircle": "\u24D3", - "dcircumflexbelow": "\u1E13", + "dbsquare": "\u33c8", + "dcaron": "\u010f", + "dcedilla": "\u1e11", + "dcircle": "\u24d3", + "dcircumflexbelow": "\u1e13", "dcroat": "\u0111", - "ddabengali": "\u09A1", + "ddabengali": "\u09a1", "ddadeva": "\u0921", - "ddagujarati": "\u0AA1", - "ddagurmukhi": "\u0A21", + "ddagujarati": "\u0aa1", + "ddagurmukhi": "\u0a21", "ddalarabic": "\u0688", - "ddalfinalarabic": "\uFB89", - "dddhadeva": "\u095C", - "ddhabengali": "\u09A2", + "ddalfinalarabic": "\ufb89", + "dddhadeva": "\u095c", + "ddhabengali": "\u09a2", "ddhadeva": "\u0922", - "ddhagujarati": "\u0AA2", - "ddhagurmukhi": "\u0A22", - "ddotaccent": "\u1E0B", - "ddotbelow": "\u1E0D", - "decimalseparatorarabic": "\u066B", - "decimalseparatorpersian": "\u066B", + "ddhagujarati": "\u0aa2", + "ddhagurmukhi": "\u0a22", + "ddotaccent": "\u1e0b", + "ddotbelow": "\u1e0d", + "decimalseparatorarabic": "\u066b", + "decimalseparatorpersian": "\u066b", "decyrillic": "\u0434", - "degree": "\u00B0", - "dehihebrew": "\u05AD", + "degree": "\u00b0", + "dehihebrew": "\u05ad", "dehiragana": "\u3067", - "deicoptic": "\u03EF", - "dekatakana": "\u30C7", - "deleteleft": "\u232B", + "deicoptic": "\u03ef", + "dekatakana": "\u30c7", + "deleteleft": "\u232b", "deleteright": "\u2326", - "delta": "\u03B4", - "deltaturned": "\u018D", - "denominatorminusonenumeratorbengali": "\u09F8", - "dezh": "\u02A4", - "dhabengali": "\u09A7", + "delta": "\u03b4", + "deltaturned": "\u018d", + "denominatorminusonenumeratorbengali": "\u09f8", + "dezh": "\u02a4", + "dhabengali": "\u09a7", "dhadeva": "\u0927", - "dhagujarati": "\u0AA7", - "dhagurmukhi": "\u0A27", + "dhagujarati": "\u0aa7", + "dhagurmukhi": "\u0a27", "dhook": "\u0257", "dialytikatonos": "\u0385", "dialytikatonoscmb": "\u0344", "diamond": "\u2666", "diamondsuitwhite": "\u2662", - "dieresis": "\u00A8", - "dieresisacute": "\uF6D7", + "dieresis": "\u00a8", + "dieresisacute": "\uf6d7", "dieresisbelowcmb": "\u0324", "dieresiscmb": "\u0308", - "dieresisgrave": "\uF6D8", + "dieresisgrave": "\uf6d8", "dieresistonos": "\u0385", "dihiragana": "\u3062", - "dikatakana": "\u30C2", + "dikatakana": "\u30c2", "dittomark": "\u3003", - "divide": "\u00F7", + "divide": "\u00f7", "divides": "\u2223", "divisionslash": "\u2215", "djecyrillic": "\u0452", "dkshade": "\u2593", - "dlinebelow": "\u1E0F", + "dlinebelow": "\u1e0f", "dlsquare": "\u3397", "dmacron": "\u0111", - "dmonospace": "\uFF44", + "dmonospace": "\uff44", "dnblock": "\u2584", - "dochadathai": "\u0E0E", - "dodekthai": "\u0E14", + "dochadathai": "\u0e0e", + "dodekthai": "\u0e14", "dohiragana": "\u3069", - "dokatakana": "\u30C9", + "dokatakana": "\u30c9", "dollar": "\u0024", - "dollarinferior": "\uF6E3", - "dollarmonospace": "\uFF04", - "dollaroldstyle": "\uF724", - "dollarsmall": "\uFE69", - "dollarsuperior": "\uF6E4", - "dong": "\u20AB", + "dollarinferior": "\uf6e3", + "dollarmonospace": "\uff04", + "dollaroldstyle": "\uf724", + "dollarsmall": "\ufe69", + "dollarsuperior": "\uf6e4", + "dong": "\u20ab", "dorusquare": "\u3326", - "dotaccent": "\u02D9", + "dotaccent": "\u02d9", "dotaccentcmb": "\u0307", "dotbelowcmb": "\u0323", "dotbelowcomb": "\u0323", - "dotkatakana": "\u30FB", + "dotkatakana": "\u30fb", "dotlessi": "\u0131", - "dotlessj": "\uF6BE", + "dotlessj": "\uf6be", "dotlessjstrokehook": "\u0284", - "dotmath": "\u22C5", - "dottedcircle": "\u25CC", - "doubleyodpatah": "\uFB1F", - "doubleyodpatahhebrew": "\uFB1F", - "downtackbelowcmb": "\u031E", - "downtackmod": "\u02D5", - "dparen": "\u249F", - "dsuperior": "\uF6EB", + "dotmath": "\u22c5", + "dottedcircle": "\u25cc", + "doubleyodpatah": "\ufb1f", + "doubleyodpatahhebrew": "\ufb1f", + "downtackbelowcmb": "\u031e", + "downtackmod": "\u02d5", + "dparen": "\u249f", + "dsuperior": "\uf6eb", "dtail": "\u0256", - "dtopbar": "\u018C", + "dtopbar": "\u018c", "duhiragana": "\u3065", - "dukatakana": "\u30C5", - "dz": "\u01F3", - "dzaltone": "\u02A3", - "dzcaron": "\u01C6", - "dzcurl": "\u02A5", - "dzeabkhasiancyrillic": "\u04E1", + "dukatakana": "\u30c5", + "dz": "\u01f3", + "dzaltone": "\u02a3", + "dzcaron": "\u01c6", + "dzcurl": "\u02a5", + "dzeabkhasiancyrillic": "\u04e1", "dzecyrillic": "\u0455", - "dzhecyrillic": "\u045F", + "dzhecyrillic": "\u045f", "e": "\u0065", - "eacute": "\u00E9", + "eacute": "\u00e9", "earth": "\u2641", - "ebengali": "\u098F", - "ebopomofo": "\u311C", + "ebengali": "\u098f", + "ebopomofo": "\u311c", "ebreve": "\u0115", - "ecandradeva": "\u090D", - "ecandragujarati": "\u0A8D", + "ecandradeva": "\u090d", + "ecandragujarati": "\u0a8d", "ecandravowelsigndeva": "\u0945", - "ecandravowelsigngujarati": "\u0AC5", - "ecaron": "\u011B", - "ecedillabreve": "\u1E1D", + "ecandravowelsigngujarati": "\u0ac5", + "ecaron": "\u011b", + "ecedillabreve": "\u1e1d", "echarmenian": "\u0565", "echyiwnarmenian": "\u0587", - "ecircle": "\u24D4", - "ecircumflex": "\u00EA", - "ecircumflexacute": "\u1EBF", - "ecircumflexbelow": "\u1E19", - "ecircumflexdotbelow": "\u1EC7", - "ecircumflexgrave": "\u1EC1", - "ecircumflexhookabove": "\u1EC3", - "ecircumflextilde": "\u1EC5", + "ecircle": "\u24d4", + "ecircumflex": "\u00ea", + "ecircumflexacute": "\u1ebf", + "ecircumflexbelow": "\u1e19", + "ecircumflexdotbelow": "\u1ec7", + "ecircumflexgrave": "\u1ec1", + "ecircumflexhookabove": "\u1ec3", + "ecircumflextilde": "\u1ec5", "ecyrillic": "\u0454", "edblgrave": "\u0205", - "edeva": "\u090F", - "edieresis": "\u00EB", + "edeva": "\u090f", + "edieresis": "\u00eb", "edot": "\u0117", "edotaccent": "\u0117", - "edotbelow": "\u1EB9", - "eegurmukhi": "\u0A0F", - "eematragurmukhi": "\u0A47", + "edotbelow": "\u1eb9", + "eegurmukhi": "\u0a0f", + "eematragurmukhi": "\u0a47", "efcyrillic": "\u0444", - "egrave": "\u00E8", - "egujarati": "\u0A8F", + "egrave": "\u00e8", + "egujarati": "\u0a8f", "eharmenian": "\u0567", - "ehbopomofo": "\u311D", + "ehbopomofo": "\u311d", "ehiragana": "\u3048", - "ehookabove": "\u1EBB", - "eibopomofo": "\u311F", + "ehookabove": "\u1ebb", + "eibopomofo": "\u311f", "eight": "\u0038", "eightarabic": "\u0668", - "eightbengali": "\u09EE", + "eightbengali": "\u09ee", "eightcircle": "\u2467", "eightcircleinversesansserif": "\u2791", - "eightdeva": "\u096E", + "eightdeva": "\u096e", "eighteencircle": "\u2471", "eighteenparen": "\u2485", "eighteenperiod": "\u2499", - "eightgujarati": "\u0AEE", - "eightgurmukhi": "\u0A6E", + "eightgujarati": "\u0aee", + "eightgurmukhi": "\u0a6e", "eighthackarabic": "\u0668", "eighthangzhou": "\u3028", - "eighthnotebeamed": "\u266B", + "eighthnotebeamed": "\u266b", "eightideographicparen": "\u3227", "eightinferior": "\u2088", - "eightmonospace": "\uFF18", - "eightoldstyle": "\uF738", - "eightparen": "\u247B", - "eightperiod": "\u248F", - "eightpersian": "\u06F8", + "eightmonospace": "\uff18", + "eightoldstyle": "\uf738", + "eightparen": "\u247b", + "eightperiod": "\u248f", + "eightpersian": "\u06f8", "eightroman": "\u2177", "eightsuperior": "\u2078", - "eightthai": "\u0E58", + "eightthai": "\u0e58", "einvertedbreve": "\u0207", "eiotifiedcyrillic": "\u0465", - "ekatakana": "\u30A8", - "ekatakanahalfwidth": "\uFF74", - "ekonkargurmukhi": "\u0A74", + "ekatakana": "\u30a8", + "ekatakanahalfwidth": "\uff74", + "ekonkargurmukhi": "\u0a74", "ekorean": "\u3154", - "elcyrillic": "\u043B", + "elcyrillic": "\u043b", "element": "\u2208", - "elevencircle": "\u246A", - "elevenparen": "\u247E", + "elevencircle": "\u246a", + "elevenparen": "\u247e", "elevenperiod": "\u2492", - "elevenroman": "\u217A", + "elevenroman": "\u217a", "ellipsis": "\u2026", - "ellipsisvertical": "\u22EE", + "ellipsisvertical": "\u22ee", "emacron": "\u0113", - "emacronacute": "\u1E17", - "emacrongrave": "\u1E15", - "emcyrillic": "\u043C", + "emacronacute": "\u1e17", + "emacrongrave": "\u1e15", + "emcyrillic": "\u043c", "emdash": "\u2014", - "emdashvertical": "\uFE31", - "emonospace": "\uFF45", - "emphasismarkarmenian": "\u055B", + "emdashvertical": "\ufe31", + "emonospace": "\uff45", + "emphasismarkarmenian": "\u055b", "emptyset": "\u2205", "enbopomofo": "\u3123", - "encyrillic": "\u043D", + "encyrillic": "\u043d", "endash": "\u2013", - "endashvertical": "\uFE32", - "endescendercyrillic": "\u04A3", - "eng": "\u014B", + "endashvertical": "\ufe32", + "endescendercyrillic": "\u04a3", + "eng": "\u014b", "engbopomofo": "\u3125", - "enghecyrillic": "\u04A5", - "enhookcyrillic": "\u04C8", + "enghecyrillic": "\u04a5", + "enhookcyrillic": "\u04c8", "enspace": "\u2002", "eogonek": "\u0119", "eokorean": "\u3153", - "eopen": "\u025B", - "eopenclosed": "\u029A", - "eopenreversed": "\u025C", - "eopenreversedclosed": "\u025E", - "eopenreversedhook": "\u025D", - "eparen": "\u24A0", - "epsilon": "\u03B5", - "epsilontonos": "\u03AD", - "equal": "\u003D", - "equalmonospace": "\uFF1D", - "equalsmall": "\uFE66", - "equalsuperior": "\u207C", + "eopen": "\u025b", + "eopenclosed": "\u029a", + "eopenreversed": "\u025c", + "eopenreversedclosed": "\u025e", + "eopenreversedhook": "\u025d", + "eparen": "\u24a0", + "epsilon": "\u03b5", + "epsilontonos": "\u03ad", + "equal": "\u003d", + "equalmonospace": "\uff1d", + "equalsmall": "\ufe66", + "equalsuperior": "\u207c", "equivalence": "\u2261", "erbopomofo": "\u3126", "ercyrillic": "\u0440", "ereversed": "\u0258", - "ereversedcyrillic": "\u044D", + "ereversedcyrillic": "\u044d", "escyrillic": "\u0441", - "esdescendercyrillic": "\u04AB", + "esdescendercyrillic": "\u04ab", "esh": "\u0283", "eshcurl": "\u0286", - "eshortdeva": "\u090E", + "eshortdeva": "\u090e", "eshortvowelsigndeva": "\u0946", - "eshreversedloop": "\u01AA", + "eshreversedloop": "\u01aa", "eshsquatreversed": "\u0285", "esmallhiragana": "\u3047", - "esmallkatakana": "\u30A7", - "esmallkatakanahalfwidth": "\uFF6A", - "estimated": "\u212E", - "esuperior": "\uF6EC", - "eta": "\u03B7", + "esmallkatakana": "\u30a7", + "esmallkatakanahalfwidth": "\uff6a", + "estimated": "\u212e", + "esuperior": "\uf6ec", + "eta": "\u03b7", "etarmenian": "\u0568", - "etatonos": "\u03AE", - "eth": "\u00F0", - "etilde": "\u1EBD", - "etildebelow": "\u1E1B", + "etatonos": "\u03ae", + "eth": "\u00f0", + "etilde": "\u1ebd", + "etildebelow": "\u1e1b", "etnahtafoukhhebrew": "\u0591", "etnahtafoukhlefthebrew": "\u0591", "etnahtahebrew": "\u0591", "etnahtalefthebrew": "\u0591", - "eturned": "\u01DD", + "eturned": "\u01dd", "eukorean": "\u3161", - "euro": "\u20AC", - "evowelsignbengali": "\u09C7", + "euro": "\u20ac", + "evowelsignbengali": "\u09c7", "evowelsigndeva": "\u0947", - "evowelsigngujarati": "\u0AC7", + "evowelsigngujarati": "\u0ac7", "exclam": "\u0021", - "exclamarmenian": "\u055C", - "exclamdbl": "\u203C", - "exclamdown": "\u00A1", - "exclamdownsmall": "\uF7A1", - "exclammonospace": "\uFF01", - "exclamsmall": "\uF721", + "exclamarmenian": "\u055c", + "exclamdbl": "\u203c", + "exclamdown": "\u00a1", + "exclamdownsmall": "\uf7a1", + "exclammonospace": "\uff01", + "exclamsmall": "\uf721", "existential": "\u2203", "ezh": "\u0292", - "ezhcaron": "\u01EF", + "ezhcaron": "\u01ef", "ezhcurl": "\u0293", - "ezhreversed": "\u01B9", - "ezhtail": "\u01BA", + "ezhreversed": "\u01b9", + "ezhtail": "\u01ba", "f": "\u0066", - "fadeva": "\u095E", - "fagurmukhi": "\u0A5E", + "fadeva": "\u095e", + "fagurmukhi": "\u0a5e", "fahrenheit": "\u2109", - "fathaarabic": "\u064E", - "fathalowarabic": "\u064E", - "fathatanarabic": "\u064B", + "fathaarabic": "\u064e", + "fathalowarabic": "\u064e", + "fathatanarabic": "\u064b", "fbopomofo": "\u3108", - "fcircle": "\u24D5", - "fdotaccent": "\u1E1F", + "fcircle": "\u24d5", + "fdotaccent": "\u1e1f", "feharabic": "\u0641", "feharmenian": "\u0586", - "fehfinalarabic": "\uFED2", - "fehinitialarabic": "\uFED3", - "fehmedialarabic": "\uFED4", - "feicoptic": "\u03E5", + "fehfinalarabic": "\ufed2", + "fehinitialarabic": "\ufed3", + "fehmedialarabic": "\ufed4", + "feicoptic": "\u03e5", "female": "\u2640", - "ff": "\uFB00", - "ffi": "\uFB03", - "ffl": "\uFB04", - "fi": "\uFB01", - "fifteencircle": "\u246E", + "ff": "\ufb00", + "ffi": "\ufb03", + "ffl": "\ufb04", + "fi": "\ufb01", + "fifteencircle": "\u246e", "fifteenparen": "\u2482", "fifteenperiod": "\u2496", "figuredash": "\u2012", - "filledbox": "\u25A0", - "filledrect": "\u25AC", - "finalkaf": "\u05DA", - "finalkafdagesh": "\uFB3A", - "finalkafdageshhebrew": "\uFB3A", - "finalkafhebrew": "\u05DA", - "finalkafqamats": "\u05DA\u05B8", - "finalkafqamatshebrew": "\u05DA\u05B8", - "finalkafsheva": "\u05DA\u05B0", - "finalkafshevahebrew": "\u05DA\u05B0", - "finalmem": "\u05DD", - "finalmemhebrew": "\u05DD", - "finalnun": "\u05DF", - "finalnunhebrew": "\u05DF", - "finalpe": "\u05E3", - "finalpehebrew": "\u05E3", - "finaltsadi": "\u05E5", - "finaltsadihebrew": "\u05E5", - "firsttonechinese": "\u02C9", - "fisheye": "\u25C9", + "filledbox": "\u25a0", + "filledrect": "\u25ac", + "finalkaf": "\u05da", + "finalkafdagesh": "\ufb3a", + "finalkafdageshhebrew": "\ufb3a", + "finalkafhebrew": "\u05da", + "finalkafqamats": "\u05da\u05b8", + "finalkafqamatshebrew": "\u05da\u05b8", + "finalkafsheva": "\u05da\u05b0", + "finalkafshevahebrew": "\u05da\u05b0", + "finalmem": "\u05dd", + "finalmemhebrew": "\u05dd", + "finalnun": "\u05df", + "finalnunhebrew": "\u05df", + "finalpe": "\u05e3", + "finalpehebrew": "\u05e3", + "finaltsadi": "\u05e5", + "finaltsadihebrew": "\u05e5", + "firsttonechinese": "\u02c9", + "fisheye": "\u25c9", "fitacyrillic": "\u0473", "five": "\u0035", "fivearabic": "\u0665", - "fivebengali": "\u09EB", + "fivebengali": "\u09eb", "fivecircle": "\u2464", - "fivecircleinversesansserif": "\u278E", - "fivedeva": "\u096B", - "fiveeighths": "\u215D", - "fivegujarati": "\u0AEB", - "fivegurmukhi": "\u0A6B", + "fivecircleinversesansserif": "\u278e", + "fivedeva": "\u096b", + "fiveeighths": "\u215d", + "fivegujarati": "\u0aeb", + "fivegurmukhi": "\u0a6b", "fivehackarabic": "\u0665", "fivehangzhou": "\u3025", "fiveideographicparen": "\u3224", "fiveinferior": "\u2085", - "fivemonospace": "\uFF15", - "fiveoldstyle": "\uF735", + "fivemonospace": "\uff15", + "fiveoldstyle": "\uf735", "fiveparen": "\u2478", - "fiveperiod": "\u248C", - "fivepersian": "\u06F5", + "fiveperiod": "\u248c", + "fivepersian": "\u06f5", "fiveroman": "\u2174", "fivesuperior": "\u2075", - "fivethai": "\u0E55", - "fl": "\uFB02", + "fivethai": "\u0e55", + "fl": "\ufb02", "florin": "\u0192", - "fmonospace": "\uFF46", + "fmonospace": "\uff46", "fmsquare": "\u3399", - "fofanthai": "\u0E1F", - "fofathai": "\u0E1D", - "fongmanthai": "\u0E4F", + "fofanthai": "\u0e1f", + "fofathai": "\u0e1d", + "fongmanthai": "\u0e4f", "forall": "\u2200", "four": "\u0034", "fourarabic": "\u0664", - "fourbengali": "\u09EA", + "fourbengali": "\u09ea", "fourcircle": "\u2463", - "fourcircleinversesansserif": "\u278D", - "fourdeva": "\u096A", - "fourgujarati": "\u0AEA", - "fourgurmukhi": "\u0A6A", + "fourcircleinversesansserif": "\u278d", + "fourdeva": "\u096a", + "fourgujarati": "\u0aea", + "fourgurmukhi": "\u0a6a", "fourhackarabic": "\u0664", "fourhangzhou": "\u3024", "fourideographicparen": "\u3223", "fourinferior": "\u2084", - "fourmonospace": "\uFF14", - "fournumeratorbengali": "\u09F7", - "fouroldstyle": "\uF734", + "fourmonospace": "\uff14", + "fournumeratorbengali": "\u09f7", + "fouroldstyle": "\uf734", "fourparen": "\u2477", - "fourperiod": "\u248B", - "fourpersian": "\u06F4", + "fourperiod": "\u248b", + "fourpersian": "\u06f4", "fourroman": "\u2173", "foursuperior": "\u2074", - "fourteencircle": "\u246D", + "fourteencircle": "\u246d", "fourteenparen": "\u2481", "fourteenperiod": "\u2495", - "fourthai": "\u0E54", - "fourthtonechinese": "\u02CB", - "fparen": "\u24A1", + "fourthai": "\u0e54", + "fourthtonechinese": "\u02cb", + "fparen": "\u24a1", "fraction": "\u2044", - "franc": "\u20A3", + "franc": "\u20a3", "g": "\u0067", "gabengali": "\u0997", - "gacute": "\u01F5", + "gacute": "\u01f5", "gadeva": "\u0917", - "gafarabic": "\u06AF", - "gaffinalarabic": "\uFB93", - "gafinitialarabic": "\uFB94", - "gafmedialarabic": "\uFB95", - "gagujarati": "\u0A97", - "gagurmukhi": "\u0A17", - "gahiragana": "\u304C", - "gakatakana": "\u30AC", - "gamma": "\u03B3", + "gafarabic": "\u06af", + "gaffinalarabic": "\ufb93", + "gafinitialarabic": "\ufb94", + "gafmedialarabic": "\ufb95", + "gagujarati": "\u0a97", + "gagurmukhi": "\u0a17", + "gahiragana": "\u304c", + "gakatakana": "\u30ac", + "gamma": "\u03b3", "gammalatinsmall": "\u0263", - "gammasuperior": "\u02E0", - "gangiacoptic": "\u03EB", - "gbopomofo": "\u310D", - "gbreve": "\u011F", - "gcaron": "\u01E7", + "gammasuperior": "\u02e0", + "gangiacoptic": "\u03eb", + "gbopomofo": "\u310d", + "gbreve": "\u011f", + "gcaron": "\u01e7", "gcedilla": "\u0123", - "gcircle": "\u24D6", - "gcircumflex": "\u011D", + "gcircle": "\u24d6", + "gcircumflex": "\u011d", "gcommaaccent": "\u0123", "gdot": "\u0121", "gdotaccent": "\u0121", "gecyrillic": "\u0433", "gehiragana": "\u3052", - "gekatakana": "\u30B2", + "gekatakana": "\u30b2", "geometricallyequal": "\u2251", - "gereshaccenthebrew": "\u059C", - "gereshhebrew": "\u05F3", - "gereshmuqdamhebrew": "\u059D", - "germandbls": "\u00DF", - "gershayimaccenthebrew": "\u059E", - "gershayimhebrew": "\u05F4", + "gereshaccenthebrew": "\u059c", + "gereshhebrew": "\u05f3", + "gereshmuqdamhebrew": "\u059d", + "germandbls": "\u00df", + "gershayimaccenthebrew": "\u059e", + "gershayimhebrew": "\u05f4", "getamark": "\u3013", "ghabengali": "\u0998", "ghadarmenian": "\u0572", "ghadeva": "\u0918", - "ghagujarati": "\u0A98", - "ghagurmukhi": "\u0A18", - "ghainarabic": "\u063A", - "ghainfinalarabic": "\uFECE", - "ghaininitialarabic": "\uFECF", - "ghainmedialarabic": "\uFED0", + "ghagujarati": "\u0a98", + "ghagurmukhi": "\u0a18", + "ghainarabic": "\u063a", + "ghainfinalarabic": "\ufece", + "ghaininitialarabic": "\ufecf", + "ghainmedialarabic": "\ufed0", "ghemiddlehookcyrillic": "\u0495", "ghestrokecyrillic": "\u0493", "gheupturncyrillic": "\u0491", - "ghhadeva": "\u095A", - "ghhagurmukhi": "\u0A5A", + "ghhadeva": "\u095a", + "ghhagurmukhi": "\u0a5a", "ghook": "\u0260", "ghzsquare": "\u3393", - "gihiragana": "\u304E", - "gikatakana": "\u30AE", + "gihiragana": "\u304e", + "gikatakana": "\u30ae", "gimarmenian": "\u0563", - "gimel": "\u05D2", - "gimeldagesh": "\uFB32", - "gimeldageshhebrew": "\uFB32", - "gimelhebrew": "\u05D2", + "gimel": "\u05d2", + "gimeldagesh": "\ufb32", + "gimeldageshhebrew": "\ufb32", + "gimelhebrew": "\u05d2", "gjecyrillic": "\u0453", - "glottalinvertedstroke": "\u01BE", + "glottalinvertedstroke": "\u01be", "glottalstop": "\u0294", "glottalstopinverted": "\u0296", - "glottalstopmod": "\u02C0", + "glottalstopmod": "\u02c0", "glottalstopreversed": "\u0295", - "glottalstopreversedmod": "\u02C1", - "glottalstopreversedsuperior": "\u02E4", - "glottalstopstroke": "\u02A1", - "glottalstopstrokereversed": "\u02A2", - "gmacron": "\u1E21", - "gmonospace": "\uFF47", + "glottalstopreversedmod": "\u02c1", + "glottalstopreversedsuperior": "\u02e4", + "glottalstopstroke": "\u02a1", + "glottalstopstrokereversed": "\u02a2", + "gmacron": "\u1e21", + "gmonospace": "\uff47", "gohiragana": "\u3054", - "gokatakana": "\u30B4", - "gparen": "\u24A2", - "gpasquare": "\u33AC", + "gokatakana": "\u30b4", + "gparen": "\u24a2", + "gpasquare": "\u33ac", "gradient": "\u2207", "grave": "\u0060", "gravebelowcmb": "\u0316", "gravecmb": "\u0300", "gravecomb": "\u0300", "gravedeva": "\u0953", - "gravelowmod": "\u02CE", - "gravemonospace": "\uFF40", + "gravelowmod": "\u02ce", + "gravemonospace": "\uff40", "gravetonecmb": "\u0340", - "greater": "\u003E", + "greater": "\u003e", "greaterequal": "\u2265", - "greaterequalorless": "\u22DB", - "greatermonospace": "\uFF1E", + "greaterequalorless": "\u22db", + "greatermonospace": "\uff1e", "greaterorequivalent": "\u2273", "greaterorless": "\u2277", "greateroverequal": "\u2267", - "greatersmall": "\uFE65", + "greatersmall": "\ufe65", "gscript": "\u0261", - "gstroke": "\u01E5", + "gstroke": "\u01e5", "guhiragana": "\u3050", - "guillemotleft": "\u00AB", - "guillemotright": "\u00BB", + "guillemotleft": "\u00ab", + "guillemotright": "\u00bb", "guilsinglleft": "\u2039", - "guilsinglright": "\u203A", - "gukatakana": "\u30B0", + "guilsinglright": "\u203a", + "gukatakana": "\u30b0", "guramusquare": "\u3318", - "gysquare": "\u33C9", + "gysquare": "\u33c9", "h": "\u0068", - "haabkhasiancyrillic": "\u04A9", - "haaltonearabic": "\u06C1", - "habengali": "\u09B9", - "hadescendercyrillic": "\u04B3", + "haabkhasiancyrillic": "\u04a9", + "haaltonearabic": "\u06c1", + "habengali": "\u09b9", + "hadescendercyrillic": "\u04b3", "hadeva": "\u0939", - "hagujarati": "\u0AB9", - "hagurmukhi": "\u0A39", - "haharabic": "\u062D", - "hahfinalarabic": "\uFEA2", - "hahinitialarabic": "\uFEA3", - "hahiragana": "\u306F", - "hahmedialarabic": "\uFEA4", - "haitusquare": "\u332A", - "hakatakana": "\u30CF", - "hakatakanahalfwidth": "\uFF8A", - "halantgurmukhi": "\u0A4D", + "hagujarati": "\u0ab9", + "hagurmukhi": "\u0a39", + "haharabic": "\u062d", + "hahfinalarabic": "\ufea2", + "hahinitialarabic": "\ufea3", + "hahiragana": "\u306f", + "hahmedialarabic": "\ufea4", + "haitusquare": "\u332a", + "hakatakana": "\u30cf", + "hakatakanahalfwidth": "\uff8a", + "halantgurmukhi": "\u0a4d", "hamzaarabic": "\u0621", - "hamzadammaarabic": "\u0621\u064F", - "hamzadammatanarabic": "\u0621\u064C", - "hamzafathaarabic": "\u0621\u064E", - "hamzafathatanarabic": "\u0621\u064B", + "hamzadammaarabic": "\u0621\u064f", + "hamzadammatanarabic": "\u0621\u064c", + "hamzafathaarabic": "\u0621\u064e", + "hamzafathatanarabic": "\u0621\u064b", "hamzalowarabic": "\u0621", "hamzalowkasraarabic": "\u0621\u0650", - "hamzalowkasratanarabic": "\u0621\u064D", + "hamzalowkasratanarabic": "\u0621\u064d", "hamzasukunarabic": "\u0621\u0652", "hangulfiller": "\u3164", - "hardsigncyrillic": "\u044A", - "harpoonleftbarbup": "\u21BC", - "harpoonrightbarbup": "\u21C0", - "hasquare": "\u33CA", - "hatafpatah": "\u05B2", - "hatafpatah16": "\u05B2", - "hatafpatah23": "\u05B2", - "hatafpatah2f": "\u05B2", - "hatafpatahhebrew": "\u05B2", - "hatafpatahnarrowhebrew": "\u05B2", - "hatafpatahquarterhebrew": "\u05B2", - "hatafpatahwidehebrew": "\u05B2", - "hatafqamats": "\u05B3", - "hatafqamats1b": "\u05B3", - "hatafqamats28": "\u05B3", - "hatafqamats34": "\u05B3", - "hatafqamatshebrew": "\u05B3", - "hatafqamatsnarrowhebrew": "\u05B3", - "hatafqamatsquarterhebrew": "\u05B3", - "hatafqamatswidehebrew": "\u05B3", - "hatafsegol": "\u05B1", - "hatafsegol17": "\u05B1", - "hatafsegol24": "\u05B1", - "hatafsegol30": "\u05B1", - "hatafsegolhebrew": "\u05B1", - "hatafsegolnarrowhebrew": "\u05B1", - "hatafsegolquarterhebrew": "\u05B1", - "hatafsegolwidehebrew": "\u05B1", + "hardsigncyrillic": "\u044a", + "harpoonleftbarbup": "\u21bc", + "harpoonrightbarbup": "\u21c0", + "hasquare": "\u33ca", + "hatafpatah": "\u05b2", + "hatafpatah16": "\u05b2", + "hatafpatah23": "\u05b2", + "hatafpatah2f": "\u05b2", + "hatafpatahhebrew": "\u05b2", + "hatafpatahnarrowhebrew": "\u05b2", + "hatafpatahquarterhebrew": "\u05b2", + "hatafpatahwidehebrew": "\u05b2", + "hatafqamats": "\u05b3", + "hatafqamats1b": "\u05b3", + "hatafqamats28": "\u05b3", + "hatafqamats34": "\u05b3", + "hatafqamatshebrew": "\u05b3", + "hatafqamatsnarrowhebrew": "\u05b3", + "hatafqamatsquarterhebrew": "\u05b3", + "hatafqamatswidehebrew": "\u05b3", + "hatafsegol": "\u05b1", + "hatafsegol17": "\u05b1", + "hatafsegol24": "\u05b1", + "hatafsegol30": "\u05b1", + "hatafsegolhebrew": "\u05b1", + "hatafsegolnarrowhebrew": "\u05b1", + "hatafsegolquarterhebrew": "\u05b1", + "hatafsegolwidehebrew": "\u05b1", "hbar": "\u0127", - "hbopomofo": "\u310F", - "hbrevebelow": "\u1E2B", - "hcedilla": "\u1E29", - "hcircle": "\u24D7", + "hbopomofo": "\u310f", + "hbrevebelow": "\u1e2b", + "hcedilla": "\u1e29", + "hcircle": "\u24d7", "hcircumflex": "\u0125", - "hdieresis": "\u1E27", - "hdotaccent": "\u1E23", - "hdotbelow": "\u1E25", - "he": "\u05D4", + "hdieresis": "\u1e27", + "hdotaccent": "\u1e23", + "hdotbelow": "\u1e25", + "he": "\u05d4", "heart": "\u2665", "heartsuitblack": "\u2665", "heartsuitwhite": "\u2661", - "hedagesh": "\uFB34", - "hedageshhebrew": "\uFB34", - "hehaltonearabic": "\u06C1", + "hedagesh": "\ufb34", + "hedageshhebrew": "\ufb34", + "hehaltonearabic": "\u06c1", "heharabic": "\u0647", - "hehebrew": "\u05D4", - "hehfinalaltonearabic": "\uFBA7", - "hehfinalalttwoarabic": "\uFEEA", - "hehfinalarabic": "\uFEEA", - "hehhamzaabovefinalarabic": "\uFBA5", - "hehhamzaaboveisolatedarabic": "\uFBA4", - "hehinitialaltonearabic": "\uFBA8", - "hehinitialarabic": "\uFEEB", + "hehebrew": "\u05d4", + "hehfinalaltonearabic": "\ufba7", + "hehfinalalttwoarabic": "\ufeea", + "hehfinalarabic": "\ufeea", + "hehhamzaabovefinalarabic": "\ufba5", + "hehhamzaaboveisolatedarabic": "\ufba4", + "hehinitialaltonearabic": "\ufba8", + "hehinitialarabic": "\ufeeb", "hehiragana": "\u3078", - "hehmedialaltonearabic": "\uFBA9", - "hehmedialarabic": "\uFEEC", - "heiseierasquare": "\u337B", - "hekatakana": "\u30D8", - "hekatakanahalfwidth": "\uFF8D", + "hehmedialaltonearabic": "\ufba9", + "hehmedialarabic": "\ufeec", + "heiseierasquare": "\u337b", + "hekatakana": "\u30d8", + "hekatakanahalfwidth": "\uff8d", "hekutaarusquare": "\u3336", "henghook": "\u0267", "herutusquare": "\u3339", - "het": "\u05D7", - "hethebrew": "\u05D7", + "het": "\u05d7", + "hethebrew": "\u05d7", "hhook": "\u0266", - "hhooksuperior": "\u02B1", - "hieuhacirclekorean": "\u327B", - "hieuhaparenkorean": "\u321B", - "hieuhcirclekorean": "\u326D", - "hieuhkorean": "\u314E", - "hieuhparenkorean": "\u320D", + "hhooksuperior": "\u02b1", + "hieuhacirclekorean": "\u327b", + "hieuhaparenkorean": "\u321b", + "hieuhcirclekorean": "\u326d", + "hieuhkorean": "\u314e", + "hieuhparenkorean": "\u320d", "hihiragana": "\u3072", - "hikatakana": "\u30D2", - "hikatakanahalfwidth": "\uFF8B", - "hiriq": "\u05B4", - "hiriq14": "\u05B4", - "hiriq21": "\u05B4", - "hiriq2d": "\u05B4", - "hiriqhebrew": "\u05B4", - "hiriqnarrowhebrew": "\u05B4", - "hiriqquarterhebrew": "\u05B4", - "hiriqwidehebrew": "\u05B4", - "hlinebelow": "\u1E96", - "hmonospace": "\uFF48", + "hikatakana": "\u30d2", + "hikatakanahalfwidth": "\uff8b", + "hiriq": "\u05b4", + "hiriq14": "\u05b4", + "hiriq21": "\u05b4", + "hiriq2d": "\u05b4", + "hiriqhebrew": "\u05b4", + "hiriqnarrowhebrew": "\u05b4", + "hiriqquarterhebrew": "\u05b4", + "hiriqwidehebrew": "\u05b4", + "hlinebelow": "\u1e96", + "hmonospace": "\uff48", "hoarmenian": "\u0570", - "hohipthai": "\u0E2B", - "hohiragana": "\u307B", - "hokatakana": "\u30DB", - "hokatakanahalfwidth": "\uFF8E", - "holam": "\u05B9", - "holam19": "\u05B9", - "holam26": "\u05B9", - "holam32": "\u05B9", - "holamhebrew": "\u05B9", - "holamnarrowhebrew": "\u05B9", - "holamquarterhebrew": "\u05B9", - "holamwidehebrew": "\u05B9", - "honokhukthai": "\u0E2E", + "hohipthai": "\u0e2b", + "hohiragana": "\u307b", + "hokatakana": "\u30db", + "hokatakanahalfwidth": "\uff8e", + "holam": "\u05b9", + "holam19": "\u05b9", + "holam26": "\u05b9", + "holam32": "\u05b9", + "holamhebrew": "\u05b9", + "holamnarrowhebrew": "\u05b9", + "holamquarterhebrew": "\u05b9", + "holamwidehebrew": "\u05b9", + "honokhukthai": "\u0e2e", "hookabovecomb": "\u0309", "hookcmb": "\u0309", "hookpalatalizedbelowcmb": "\u0321", "hookretroflexbelowcmb": "\u0322", "hoonsquare": "\u3342", - "horicoptic": "\u03E9", + "horicoptic": "\u03e9", "horizontalbar": "\u2015", - "horncmb": "\u031B", + "horncmb": "\u031b", "hotsprings": "\u2668", "house": "\u2302", - "hparen": "\u24A3", - "hsuperior": "\u02B0", + "hparen": "\u24a3", + "hsuperior": "\u02b0", "hturned": "\u0265", "huhiragana": "\u3075", "huiitosquare": "\u3333", - "hukatakana": "\u30D5", - "hukatakanahalfwidth": "\uFF8C", - "hungarumlaut": "\u02DD", - "hungarumlautcmb": "\u030B", + "hukatakana": "\u30d5", + "hukatakanahalfwidth": "\uff8c", + "hungarumlaut": "\u02dd", + "hungarumlautcmb": "\u030b", "hv": "\u0195", - "hyphen": "\u002D", - "hypheninferior": "\uF6E5", - "hyphenmonospace": "\uFF0D", - "hyphensmall": "\uFE63", - "hyphensuperior": "\uF6E6", + "hyphen": "\u002d", + "hypheninferior": "\uf6e5", + "hyphenmonospace": "\uff0d", + "hyphensmall": "\ufe63", + "hyphensuperior": "\uf6e6", "hyphentwo": "\u2010", "i": "\u0069", - "iacute": "\u00ED", - "iacyrillic": "\u044F", + "iacute": "\u00ed", + "iacyrillic": "\u044f", "ibengali": "\u0987", "ibopomofo": "\u3127", - "ibreve": "\u012D", - "icaron": "\u01D0", - "icircle": "\u24D8", - "icircumflex": "\u00EE", + "ibreve": "\u012d", + "icaron": "\u01d0", + "icircle": "\u24d8", + "icircumflex": "\u00ee", "icyrillic": "\u0456", "idblgrave": "\u0209", - "ideographearthcircle": "\u328F", - "ideographfirecircle": "\u328B", - "ideographicallianceparen": "\u323F", - "ideographiccallparen": "\u323A", - "ideographiccentrecircle": "\u32A5", + "ideographearthcircle": "\u328f", + "ideographfirecircle": "\u328b", + "ideographicallianceparen": "\u323f", + "ideographiccallparen": "\u323a", + "ideographiccentrecircle": "\u32a5", "ideographicclose": "\u3006", "ideographiccomma": "\u3001", - "ideographiccommaleft": "\uFF64", + "ideographiccommaleft": "\uff64", "ideographiccongratulationparen": "\u3237", - "ideographiccorrectcircle": "\u32A3", - "ideographicearthparen": "\u322F", - "ideographicenterpriseparen": "\u323D", - "ideographicexcellentcircle": "\u329D", + "ideographiccorrectcircle": "\u32a3", + "ideographicearthparen": "\u322f", + "ideographicenterpriseparen": "\u323d", + "ideographicexcellentcircle": "\u329d", "ideographicfestivalparen": "\u3240", "ideographicfinancialcircle": "\u3296", "ideographicfinancialparen": "\u3236", - "ideographicfireparen": "\u322B", + "ideographicfireparen": "\u322b", "ideographichaveparen": "\u3232", - "ideographichighcircle": "\u32A4", + "ideographichighcircle": "\u32a4", "ideographiciterationmark": "\u3005", "ideographiclaborcircle": "\u3298", "ideographiclaborparen": "\u3238", - "ideographicleftcircle": "\u32A7", - "ideographiclowcircle": "\u32A6", - "ideographicmedicinecircle": "\u32A9", - "ideographicmetalparen": "\u322E", - "ideographicmoonparen": "\u322A", + "ideographicleftcircle": "\u32a7", + "ideographiclowcircle": "\u32a6", + "ideographicmedicinecircle": "\u32a9", + "ideographicmetalparen": "\u322e", + "ideographicmoonparen": "\u322a", "ideographicnameparen": "\u3234", "ideographicperiod": "\u3002", - "ideographicprintcircle": "\u329E", + "ideographicprintcircle": "\u329e", "ideographicreachparen": "\u3243", "ideographicrepresentparen": "\u3239", - "ideographicresourceparen": "\u323E", - "ideographicrightcircle": "\u32A8", + "ideographicresourceparen": "\u323e", + "ideographicrightcircle": "\u32a8", "ideographicsecretcircle": "\u3299", "ideographicselfparen": "\u3242", "ideographicsocietyparen": "\u3233", "ideographicspace": "\u3000", "ideographicspecialparen": "\u3235", "ideographicstockparen": "\u3231", - "ideographicstudyparen": "\u323B", + "ideographicstudyparen": "\u323b", "ideographicsunparen": "\u3230", - "ideographicsuperviseparen": "\u323C", - "ideographicwaterparen": "\u322C", - "ideographicwoodparen": "\u322D", + "ideographicsuperviseparen": "\u323c", + "ideographicwaterparen": "\u322c", + "ideographicwoodparen": "\u322d", "ideographiczero": "\u3007", - "ideographmetalcircle": "\u328E", - "ideographmooncircle": "\u328A", + "ideographmetalcircle": "\u328e", + "ideographmooncircle": "\u328a", "ideographnamecircle": "\u3294", "ideographsuncircle": "\u3290", - "ideographwatercircle": "\u328C", - "ideographwoodcircle": "\u328D", + "ideographwatercircle": "\u328c", + "ideographwoodcircle": "\u328d", "ideva": "\u0907", - "idieresis": "\u00EF", - "idieresisacute": "\u1E2F", - "idieresiscyrillic": "\u04E5", - "idotbelow": "\u1ECB", - "iebrevecyrillic": "\u04D7", + "idieresis": "\u00ef", + "idieresisacute": "\u1e2f", + "idieresiscyrillic": "\u04e5", + "idotbelow": "\u1ecb", + "iebrevecyrillic": "\u04d7", "iecyrillic": "\u0435", "ieungacirclekorean": "\u3275", "ieungaparenkorean": "\u3215", "ieungcirclekorean": "\u3267", "ieungkorean": "\u3147", "ieungparenkorean": "\u3207", - "igrave": "\u00EC", - "igujarati": "\u0A87", - "igurmukhi": "\u0A07", + "igrave": "\u00ec", + "igujarati": "\u0a87", + "igurmukhi": "\u0a07", "ihiragana": "\u3044", - "ihookabove": "\u1EC9", + "ihookabove": "\u1ec9", "iibengali": "\u0988", "iicyrillic": "\u0438", "iideva": "\u0908", - "iigujarati": "\u0A88", - "iigurmukhi": "\u0A08", - "iimatragurmukhi": "\u0A40", - "iinvertedbreve": "\u020B", + "iigujarati": "\u0a88", + "iigurmukhi": "\u0a08", + "iimatragurmukhi": "\u0a40", + "iinvertedbreve": "\u020b", "iishortcyrillic": "\u0439", - "iivowelsignbengali": "\u09C0", + "iivowelsignbengali": "\u09c0", "iivowelsigndeva": "\u0940", - "iivowelsigngujarati": "\u0AC0", + "iivowelsigngujarati": "\u0ac0", "ij": "\u0133", - "ikatakana": "\u30A4", - "ikatakanahalfwidth": "\uFF72", + "ikatakana": "\u30a4", + "ikatakanahalfwidth": "\uff72", "ikorean": "\u3163", - "ilde": "\u02DC", - "iluyhebrew": "\u05AC", - "imacron": "\u012B", - "imacroncyrillic": "\u04E3", + "ilde": "\u02dc", + "iluyhebrew": "\u05ac", + "imacron": "\u012b", + "imacroncyrillic": "\u04e3", "imageorapproximatelyequal": "\u2253", - "imatragurmukhi": "\u0A3F", - "imonospace": "\uFF49", + "imatragurmukhi": "\u0a3f", + "imonospace": "\uff49", "increment": "\u2206", - "infinity": "\u221E", - "iniarmenian": "\u056B", - "integral": "\u222B", + "infinity": "\u221e", + "iniarmenian": "\u056b", + "integral": "\u222b", "integralbottom": "\u2321", "integralbt": "\u2321", - "integralex": "\uF8F5", + "integralex": "\uf8f5", "integraltop": "\u2320", "integraltp": "\u2320", "intersection": "\u2229", "intisquare": "\u3305", - "invbullet": "\u25D8", - "invcircle": "\u25D9", - "invsmileface": "\u263B", + "invbullet": "\u25d8", + "invcircle": "\u25d9", + "invsmileface": "\u263b", "iocyrillic": "\u0451", - "iogonek": "\u012F", - "iota": "\u03B9", - "iotadieresis": "\u03CA", + "iogonek": "\u012f", + "iota": "\u03b9", + "iotadieresis": "\u03ca", "iotadieresistonos": "\u0390", "iotalatin": "\u0269", - "iotatonos": "\u03AF", - "iparen": "\u24A4", - "irigurmukhi": "\u0A72", + "iotatonos": "\u03af", + "iparen": "\u24a4", + "irigurmukhi": "\u0a72", "ismallhiragana": "\u3043", - "ismallkatakana": "\u30A3", - "ismallkatakanahalfwidth": "\uFF68", - "issharbengali": "\u09FA", + "ismallkatakana": "\u30a3", + "ismallkatakanahalfwidth": "\uff68", + "issharbengali": "\u09fa", "istroke": "\u0268", - "isuperior": "\uF6ED", - "iterationhiragana": "\u309D", - "iterationkatakana": "\u30FD", + "isuperior": "\uf6ed", + "iterationhiragana": "\u309d", + "iterationkatakana": "\u30fd", "itilde": "\u0129", - "itildebelow": "\u1E2D", + "itildebelow": "\u1e2d", "iubopomofo": "\u3129", - "iucyrillic": "\u044E", - "ivowelsignbengali": "\u09BF", - "ivowelsigndeva": "\u093F", - "ivowelsigngujarati": "\u0ABF", + "iucyrillic": "\u044e", + "ivowelsignbengali": "\u09bf", + "ivowelsigndeva": "\u093f", + "ivowelsigngujarati": "\u0abf", "izhitsacyrillic": "\u0475", "izhitsadblgravecyrillic": "\u0477", - "j": "\u006A", + "j": "\u006a", "jaarmenian": "\u0571", - "jabengali": "\u099C", - "jadeva": "\u091C", - "jagujarati": "\u0A9C", - "jagurmukhi": "\u0A1C", + "jabengali": "\u099c", + "jadeva": "\u091c", + "jagujarati": "\u0a9c", + "jagurmukhi": "\u0a1c", "jbopomofo": "\u3110", - "jcaron": "\u01F0", - "jcircle": "\u24D9", + "jcaron": "\u01f0", + "jcircle": "\u24d9", "jcircumflex": "\u0135", - "jcrossedtail": "\u029D", - "jdotlessstroke": "\u025F", + "jcrossedtail": "\u029d", + "jdotlessstroke": "\u025f", "jecyrillic": "\u0458", - "jeemarabic": "\u062C", - "jeemfinalarabic": "\uFE9E", - "jeeminitialarabic": "\uFE9F", - "jeemmedialarabic": "\uFEA0", + "jeemarabic": "\u062c", + "jeemfinalarabic": "\ufe9e", + "jeeminitialarabic": "\ufe9f", + "jeemmedialarabic": "\ufea0", "jeharabic": "\u0698", - "jehfinalarabic": "\uFB8B", - "jhabengali": "\u099D", - "jhadeva": "\u091D", - "jhagujarati": "\u0A9D", - "jhagurmukhi": "\u0A1D", - "jheharmenian": "\u057B", + "jehfinalarabic": "\ufb8b", + "jhabengali": "\u099d", + "jhadeva": "\u091d", + "jhagujarati": "\u0a9d", + "jhagurmukhi": "\u0a1d", + "jheharmenian": "\u057b", "jis": "\u3004", - "jmonospace": "\uFF4A", - "jparen": "\u24A5", - "jsuperior": "\u02B2", - "k": "\u006B", - "kabashkircyrillic": "\u04A1", + "jmonospace": "\uff4a", + "jparen": "\u24a5", + "jsuperior": "\u02b2", + "k": "\u006b", + "kabashkircyrillic": "\u04a1", "kabengali": "\u0995", - "kacute": "\u1E31", - "kacyrillic": "\u043A", - "kadescendercyrillic": "\u049B", + "kacute": "\u1e31", + "kacyrillic": "\u043a", + "kadescendercyrillic": "\u049b", "kadeva": "\u0915", - "kaf": "\u05DB", + "kaf": "\u05db", "kafarabic": "\u0643", - "kafdagesh": "\uFB3B", - "kafdageshhebrew": "\uFB3B", - "kaffinalarabic": "\uFEDA", - "kafhebrew": "\u05DB", - "kafinitialarabic": "\uFEDB", - "kafmedialarabic": "\uFEDC", - "kafrafehebrew": "\uFB4D", - "kagujarati": "\u0A95", - "kagurmukhi": "\u0A15", - "kahiragana": "\u304B", - "kahookcyrillic": "\u04C4", - "kakatakana": "\u30AB", - "kakatakanahalfwidth": "\uFF76", - "kappa": "\u03BA", - "kappasymbolgreek": "\u03F0", + "kafdagesh": "\ufb3b", + "kafdageshhebrew": "\ufb3b", + "kaffinalarabic": "\ufeda", + "kafhebrew": "\u05db", + "kafinitialarabic": "\ufedb", + "kafmedialarabic": "\ufedc", + "kafrafehebrew": "\ufb4d", + "kagujarati": "\u0a95", + "kagurmukhi": "\u0a15", + "kahiragana": "\u304b", + "kahookcyrillic": "\u04c4", + "kakatakana": "\u30ab", + "kakatakanahalfwidth": "\uff76", + "kappa": "\u03ba", + "kappasymbolgreek": "\u03f0", "kapyeounmieumkorean": "\u3171", "kapyeounphieuphkorean": "\u3184", "kapyeounpieupkorean": "\u3178", "kapyeounssangpieupkorean": "\u3179", - "karoriisquare": "\u330D", + "karoriisquare": "\u330d", "kashidaautoarabic": "\u0640", "kashidaautonosidebearingarabic": "\u0640", - "kasmallkatakana": "\u30F5", + "kasmallkatakana": "\u30f5", "kasquare": "\u3384", "kasraarabic": "\u0650", - "kasratanarabic": "\u064D", - "kastrokecyrillic": "\u049F", - "katahiraprolongmarkhalfwidth": "\uFF70", - "kaverticalstrokecyrillic": "\u049D", - "kbopomofo": "\u310E", + "kasratanarabic": "\u064d", + "kastrokecyrillic": "\u049f", + "katahiraprolongmarkhalfwidth": "\uff70", + "kaverticalstrokecyrillic": "\u049d", + "kbopomofo": "\u310e", "kcalsquare": "\u3389", - "kcaron": "\u01E9", + "kcaron": "\u01e9", "kcedilla": "\u0137", - "kcircle": "\u24DA", + "kcircle": "\u24da", "kcommaaccent": "\u0137", - "kdotbelow": "\u1E33", + "kdotbelow": "\u1e33", "keharmenian": "\u0584", "kehiragana": "\u3051", - "kekatakana": "\u30B1", - "kekatakanahalfwidth": "\uFF79", - "kenarmenian": "\u056F", - "kesmallkatakana": "\u30F6", + "kekatakana": "\u30b1", + "kekatakanahalfwidth": "\uff79", + "kenarmenian": "\u056f", + "kesmallkatakana": "\u30f6", "kgreenlandic": "\u0138", "khabengali": "\u0996", "khacyrillic": "\u0445", "khadeva": "\u0916", - "khagujarati": "\u0A96", - "khagurmukhi": "\u0A16", - "khaharabic": "\u062E", - "khahfinalarabic": "\uFEA6", - "khahinitialarabic": "\uFEA7", - "khahmedialarabic": "\uFEA8", - "kheicoptic": "\u03E7", + "khagujarati": "\u0a96", + "khagurmukhi": "\u0a16", + "khaharabic": "\u062e", + "khahfinalarabic": "\ufea6", + "khahinitialarabic": "\ufea7", + "khahmedialarabic": "\ufea8", + "kheicoptic": "\u03e7", "khhadeva": "\u0959", - "khhagurmukhi": "\u0A59", + "khhagurmukhi": "\u0a59", "khieukhacirclekorean": "\u3278", "khieukhaparenkorean": "\u3218", - "khieukhcirclekorean": "\u326A", - "khieukhkorean": "\u314B", - "khieukhparenkorean": "\u320A", - "khokhaithai": "\u0E02", - "khokhonthai": "\u0E05", - "khokhuatthai": "\u0E03", - "khokhwaithai": "\u0E04", - "khomutthai": "\u0E5B", + "khieukhcirclekorean": "\u326a", + "khieukhkorean": "\u314b", + "khieukhparenkorean": "\u320a", + "khokhaithai": "\u0e02", + "khokhonthai": "\u0e05", + "khokhuatthai": "\u0e03", + "khokhwaithai": "\u0e04", + "khomutthai": "\u0e5b", "khook": "\u0199", - "khorakhangthai": "\u0E06", + "khorakhangthai": "\u0e06", "khzsquare": "\u3391", - "kihiragana": "\u304D", - "kikatakana": "\u30AD", - "kikatakanahalfwidth": "\uFF77", + "kihiragana": "\u304d", + "kikatakana": "\u30ad", + "kikatakanahalfwidth": "\uff77", "kiroguramusquare": "\u3315", "kiromeetorusquare": "\u3316", "kirosquare": "\u3314", - "kiyeokacirclekorean": "\u326E", - "kiyeokaparenkorean": "\u320E", + "kiyeokacirclekorean": "\u326e", + "kiyeokaparenkorean": "\u320e", "kiyeokcirclekorean": "\u3260", "kiyeokkorean": "\u3131", "kiyeokparenkorean": "\u3200", "kiyeoksioskorean": "\u3133", - "kjecyrillic": "\u045C", - "klinebelow": "\u1E35", + "kjecyrillic": "\u045c", + "klinebelow": "\u1e35", "klsquare": "\u3398", - "kmcubedsquare": "\u33A6", - "kmonospace": "\uFF4B", - "kmsquaredsquare": "\u33A2", + "kmcubedsquare": "\u33a6", + "kmonospace": "\uff4b", + "kmsquaredsquare": "\u33a2", "kohiragana": "\u3053", - "kohmsquare": "\u33C0", - "kokaithai": "\u0E01", - "kokatakana": "\u30B3", - "kokatakanahalfwidth": "\uFF7A", - "kooposquare": "\u331E", + "kohmsquare": "\u33c0", + "kokaithai": "\u0e01", + "kokatakana": "\u30b3", + "kokatakanahalfwidth": "\uff7a", + "kooposquare": "\u331e", "koppacyrillic": "\u0481", - "koreanstandardsymbol": "\u327F", + "koreanstandardsymbol": "\u327f", "koroniscmb": "\u0343", - "kparen": "\u24A6", - "kpasquare": "\u33AA", - "ksicyrillic": "\u046F", - "ktsquare": "\u33CF", - "kturned": "\u029E", - "kuhiragana": "\u304F", - "kukatakana": "\u30AF", - "kukatakanahalfwidth": "\uFF78", - "kvsquare": "\u33B8", - "kwsquare": "\u33BE", - "l": "\u006C", - "labengali": "\u09B2", - "lacute": "\u013A", + "kparen": "\u24a6", + "kpasquare": "\u33aa", + "ksicyrillic": "\u046f", + "ktsquare": "\u33cf", + "kturned": "\u029e", + "kuhiragana": "\u304f", + "kukatakana": "\u30af", + "kukatakanahalfwidth": "\uff78", + "kvsquare": "\u33b8", + "kwsquare": "\u33be", + "l": "\u006c", + "labengali": "\u09b2", + "lacute": "\u013a", "ladeva": "\u0932", - "lagujarati": "\u0AB2", - "lagurmukhi": "\u0A32", - "lakkhangyaothai": "\u0E45", - "lamaleffinalarabic": "\uFEFC", - "lamalefhamzaabovefinalarabic": "\uFEF8", - "lamalefhamzaaboveisolatedarabic": "\uFEF7", - "lamalefhamzabelowfinalarabic": "\uFEFA", - "lamalefhamzabelowisolatedarabic": "\uFEF9", - "lamalefisolatedarabic": "\uFEFB", - "lamalefmaddaabovefinalarabic": "\uFEF6", - "lamalefmaddaaboveisolatedarabic": "\uFEF5", + "lagujarati": "\u0ab2", + "lagurmukhi": "\u0a32", + "lakkhangyaothai": "\u0e45", + "lamaleffinalarabic": "\ufefc", + "lamalefhamzaabovefinalarabic": "\ufef8", + "lamalefhamzaaboveisolatedarabic": "\ufef7", + "lamalefhamzabelowfinalarabic": "\ufefa", + "lamalefhamzabelowisolatedarabic": "\ufef9", + "lamalefisolatedarabic": "\ufefb", + "lamalefmaddaabovefinalarabic": "\ufef6", + "lamalefmaddaaboveisolatedarabic": "\ufef5", "lamarabic": "\u0644", - "lambda": "\u03BB", - "lambdastroke": "\u019B", - "lamed": "\u05DC", - "lameddagesh": "\uFB3C", - "lameddageshhebrew": "\uFB3C", - "lamedhebrew": "\u05DC", - "lamedholam": "\u05DC\u05B9", - "lamedholamdagesh": "\u05DC\u05B9\u05BC", - "lamedholamdageshhebrew": "\u05DC\u05B9\u05BC", - "lamedholamhebrew": "\u05DC\u05B9", - "lamfinalarabic": "\uFEDE", - "lamhahinitialarabic": "\uFCCA", - "laminitialarabic": "\uFEDF", - "lamjeeminitialarabic": "\uFCC9", - "lamkhahinitialarabic": "\uFCCB", - "lamlamhehisolatedarabic": "\uFDF2", - "lammedialarabic": "\uFEE0", - "lammeemhahinitialarabic": "\uFD88", - "lammeeminitialarabic": "\uFCCC", - "lammeemjeeminitialarabic": "\uFEDF\uFEE4\uFEA0", - "lammeemkhahinitialarabic": "\uFEDF\uFEE4\uFEA8", - "largecircle": "\u25EF", - "lbar": "\u019A", - "lbelt": "\u026C", - "lbopomofo": "\u310C", - "lcaron": "\u013E", - "lcedilla": "\u013C", - "lcircle": "\u24DB", - "lcircumflexbelow": "\u1E3D", - "lcommaaccent": "\u013C", + "lambda": "\u03bb", + "lambdastroke": "\u019b", + "lamed": "\u05dc", + "lameddagesh": "\ufb3c", + "lameddageshhebrew": "\ufb3c", + "lamedhebrew": "\u05dc", + "lamedholam": "\u05dc\u05b9", + "lamedholamdagesh": "\u05dc\u05b9\u05bc", + "lamedholamdageshhebrew": "\u05dc\u05b9\u05bc", + "lamedholamhebrew": "\u05dc\u05b9", + "lamfinalarabic": "\ufede", + "lamhahinitialarabic": "\ufcca", + "laminitialarabic": "\ufedf", + "lamjeeminitialarabic": "\ufcc9", + "lamkhahinitialarabic": "\ufccb", + "lamlamhehisolatedarabic": "\ufdf2", + "lammedialarabic": "\ufee0", + "lammeemhahinitialarabic": "\ufd88", + "lammeeminitialarabic": "\ufccc", + "lammeemjeeminitialarabic": "\ufedf\ufee4\ufea0", + "lammeemkhahinitialarabic": "\ufedf\ufee4\ufea8", + "largecircle": "\u25ef", + "lbar": "\u019a", + "lbelt": "\u026c", + "lbopomofo": "\u310c", + "lcaron": "\u013e", + "lcedilla": "\u013c", + "lcircle": "\u24db", + "lcircumflexbelow": "\u1e3d", + "lcommaaccent": "\u013c", "ldot": "\u0140", "ldotaccent": "\u0140", - "ldotbelow": "\u1E37", - "ldotbelowmacron": "\u1E39", - "leftangleabovecmb": "\u031A", + "ldotbelow": "\u1e37", + "ldotbelowmacron": "\u1e39", + "leftangleabovecmb": "\u031a", "lefttackbelowcmb": "\u0318", - "less": "\u003C", + "less": "\u003c", "lessequal": "\u2264", - "lessequalorgreater": "\u22DA", - "lessmonospace": "\uFF1C", + "lessequalorgreater": "\u22da", + "lessmonospace": "\uff1c", "lessorequivalent": "\u2272", "lessorgreater": "\u2276", "lessoverequal": "\u2266", - "lesssmall": "\uFE64", - "lezh": "\u026E", - "lfblock": "\u258C", - "lhookretroflex": "\u026D", - "lira": "\u20A4", - "liwnarmenian": "\u056C", - "lj": "\u01C9", + "lesssmall": "\ufe64", + "lezh": "\u026e", + "lfblock": "\u258c", + "lhookretroflex": "\u026d", + "lira": "\u20a4", + "liwnarmenian": "\u056c", + "lj": "\u01c9", "ljecyrillic": "\u0459", - "ll": "\uF6C0", + "ll": "\uf6c0", "lladeva": "\u0933", - "llagujarati": "\u0AB3", - "llinebelow": "\u1E3B", + "llagujarati": "\u0ab3", + "llinebelow": "\u1e3b", "llladeva": "\u0934", - "llvocalicbengali": "\u09E1", + "llvocalicbengali": "\u09e1", "llvocalicdeva": "\u0961", - "llvocalicvowelsignbengali": "\u09E3", + "llvocalicvowelsignbengali": "\u09e3", "llvocalicvowelsigndeva": "\u0963", - "lmiddletilde": "\u026B", - "lmonospace": "\uFF4C", - "lmsquare": "\u33D0", - "lochulathai": "\u0E2C", + "lmiddletilde": "\u026b", + "lmonospace": "\uff4c", + "lmsquare": "\u33d0", + "lochulathai": "\u0e2c", "logicaland": "\u2227", - "logicalnot": "\u00AC", + "logicalnot": "\u00ac", "logicalnotreversed": "\u2310", "logicalor": "\u2228", - "lolingthai": "\u0E25", - "longs": "\u017F", - "lowlinecenterline": "\uFE4E", + "lolingthai": "\u0e25", + "longs": "\u017f", + "lowlinecenterline": "\ufe4e", "lowlinecmb": "\u0332", - "lowlinedashed": "\uFE4D", - "lozenge": "\u25CA", - "lparen": "\u24A7", + "lowlinedashed": "\ufe4d", + "lozenge": "\u25ca", + "lparen": "\u24a7", "lslash": "\u0142", "lsquare": "\u2113", - "lsuperior": "\uF6EE", + "lsuperior": "\uf6ee", "ltshade": "\u2591", - "luthai": "\u0E26", - "lvocalicbengali": "\u098C", - "lvocalicdeva": "\u090C", - "lvocalicvowelsignbengali": "\u09E2", + "luthai": "\u0e26", + "lvocalicbengali": "\u098c", + "lvocalicdeva": "\u090c", + "lvocalicvowelsignbengali": "\u09e2", "lvocalicvowelsigndeva": "\u0962", - "lxsquare": "\u33D3", - "m": "\u006D", - "mabengali": "\u09AE", - "macron": "\u00AF", + "lxsquare": "\u33d3", + "m": "\u006d", + "mabengali": "\u09ae", + "macron": "\u00af", "macronbelowcmb": "\u0331", "macroncmb": "\u0304", - "macronlowmod": "\u02CD", - "macronmonospace": "\uFFE3", - "macute": "\u1E3F", - "madeva": "\u092E", - "magujarati": "\u0AAE", - "magurmukhi": "\u0A2E", - "mahapakhhebrew": "\u05A4", - "mahapakhlefthebrew": "\u05A4", - "mahiragana": "\u307E", - "maichattawalowleftthai": "\uF895", - "maichattawalowrightthai": "\uF894", - "maichattawathai": "\u0E4B", - "maichattawaupperleftthai": "\uF893", - "maieklowleftthai": "\uF88C", - "maieklowrightthai": "\uF88B", - "maiekthai": "\u0E48", - "maiekupperleftthai": "\uF88A", - "maihanakatleftthai": "\uF884", - "maihanakatthai": "\u0E31", - "maitaikhuleftthai": "\uF889", - "maitaikhuthai": "\u0E47", - "maitholowleftthai": "\uF88F", - "maitholowrightthai": "\uF88E", - "maithothai": "\u0E49", - "maithoupperleftthai": "\uF88D", - "maitrilowleftthai": "\uF892", - "maitrilowrightthai": "\uF891", - "maitrithai": "\u0E4A", - "maitriupperleftthai": "\uF890", - "maiyamokthai": "\u0E46", - "makatakana": "\u30DE", - "makatakanahalfwidth": "\uFF8F", + "macronlowmod": "\u02cd", + "macronmonospace": "\uffe3", + "macute": "\u1e3f", + "madeva": "\u092e", + "magujarati": "\u0aae", + "magurmukhi": "\u0a2e", + "mahapakhhebrew": "\u05a4", + "mahapakhlefthebrew": "\u05a4", + "mahiragana": "\u307e", + "maichattawalowleftthai": "\uf895", + "maichattawalowrightthai": "\uf894", + "maichattawathai": "\u0e4b", + "maichattawaupperleftthai": "\uf893", + "maieklowleftthai": "\uf88c", + "maieklowrightthai": "\uf88b", + "maiekthai": "\u0e48", + "maiekupperleftthai": "\uf88a", + "maihanakatleftthai": "\uf884", + "maihanakatthai": "\u0e31", + "maitaikhuleftthai": "\uf889", + "maitaikhuthai": "\u0e47", + "maitholowleftthai": "\uf88f", + "maitholowrightthai": "\uf88e", + "maithothai": "\u0e49", + "maithoupperleftthai": "\uf88d", + "maitrilowleftthai": "\uf892", + "maitrilowrightthai": "\uf891", + "maitrithai": "\u0e4a", + "maitriupperleftthai": "\uf890", + "maiyamokthai": "\u0e46", + "makatakana": "\u30de", + "makatakanahalfwidth": "\uff8f", "male": "\u2642", "mansyonsquare": "\u3347", - "maqafhebrew": "\u05BE", + "maqafhebrew": "\u05be", "mars": "\u2642", - "masoracirclehebrew": "\u05AF", + "masoracirclehebrew": "\u05af", "masquare": "\u3383", "mbopomofo": "\u3107", - "mbsquare": "\u33D4", - "mcircle": "\u24DC", - "mcubedsquare": "\u33A5", - "mdotaccent": "\u1E41", - "mdotbelow": "\u1E43", + "mbsquare": "\u33d4", + "mcircle": "\u24dc", + "mcubedsquare": "\u33a5", + "mdotaccent": "\u1e41", + "mdotbelow": "\u1e43", "meemarabic": "\u0645", - "meemfinalarabic": "\uFEE2", - "meeminitialarabic": "\uFEE3", - "meemmedialarabic": "\uFEE4", - "meemmeeminitialarabic": "\uFCD1", - "meemmeemisolatedarabic": "\uFC48", - "meetorusquare": "\u334D", + "meemfinalarabic": "\ufee2", + "meeminitialarabic": "\ufee3", + "meemmedialarabic": "\ufee4", + "meemmeeminitialarabic": "\ufcd1", + "meemmeemisolatedarabic": "\ufc48", + "meetorusquare": "\u334d", "mehiragana": "\u3081", - "meizierasquare": "\u337E", - "mekatakana": "\u30E1", - "mekatakanahalfwidth": "\uFF92", - "mem": "\u05DE", - "memdagesh": "\uFB3E", - "memdageshhebrew": "\uFB3E", - "memhebrew": "\u05DE", + "meizierasquare": "\u337e", + "mekatakana": "\u30e1", + "mekatakanahalfwidth": "\uff92", + "mem": "\u05de", + "memdagesh": "\ufb3e", + "memdageshhebrew": "\ufb3e", + "memhebrew": "\u05de", "menarmenian": "\u0574", - "merkhahebrew": "\u05A5", - "merkhakefulahebrew": "\u05A6", - "merkhakefulalefthebrew": "\u05A6", - "merkhalefthebrew": "\u05A5", + "merkhahebrew": "\u05a5", + "merkhakefulahebrew": "\u05a6", + "merkhakefulalefthebrew": "\u05a6", + "merkhalefthebrew": "\u05a5", "mhook": "\u0271", "mhzsquare": "\u3392", - "middledotkatakanahalfwidth": "\uFF65", - "middot": "\u00B7", + "middledotkatakanahalfwidth": "\uff65", + "middot": "\u00b7", "mieumacirclekorean": "\u3272", "mieumaparenkorean": "\u3212", "mieumcirclekorean": "\u3264", "mieumkorean": "\u3141", "mieumpansioskorean": "\u3170", "mieumparenkorean": "\u3204", - "mieumpieupkorean": "\u316E", - "mieumsioskorean": "\u316F", - "mihiragana": "\u307F", - "mikatakana": "\u30DF", - "mikatakanahalfwidth": "\uFF90", + "mieumpieupkorean": "\u316e", + "mieumsioskorean": "\u316f", + "mihiragana": "\u307f", + "mikatakana": "\u30df", + "mikatakanahalfwidth": "\uff90", "minus": "\u2212", "minusbelowcmb": "\u0320", "minuscircle": "\u2296", - "minusmod": "\u02D7", + "minusmod": "\u02d7", "minusplus": "\u2213", "minute": "\u2032", - "miribaarusquare": "\u334A", + "miribaarusquare": "\u334a", "mirisquare": "\u3349", "mlonglegturned": "\u0270", "mlsquare": "\u3396", - "mmcubedsquare": "\u33A3", - "mmonospace": "\uFF4D", - "mmsquaredsquare": "\u339F", + "mmcubedsquare": "\u33a3", + "mmonospace": "\uff4d", + "mmsquaredsquare": "\u339f", "mohiragana": "\u3082", - "mohmsquare": "\u33C1", - "mokatakana": "\u30E2", - "mokatakanahalfwidth": "\uFF93", - "molsquare": "\u33D6", - "momathai": "\u0E21", - "moverssquare": "\u33A7", - "moverssquaredsquare": "\u33A8", - "mparen": "\u24A8", - "mpasquare": "\u33AB", - "mssquare": "\u33B3", - "msuperior": "\uF6EF", - "mturned": "\u026F", - "mu": "\u00B5", - "mu1": "\u00B5", + "mohmsquare": "\u33c1", + "mokatakana": "\u30e2", + "mokatakanahalfwidth": "\uff93", + "molsquare": "\u33d6", + "momathai": "\u0e21", + "moverssquare": "\u33a7", + "moverssquaredsquare": "\u33a8", + "mparen": "\u24a8", + "mpasquare": "\u33ab", + "mssquare": "\u33b3", + "msuperior": "\uf6ef", + "mturned": "\u026f", + "mu": "\u00b5", + "mu1": "\u00b5", "muasquare": "\u3382", - "muchgreater": "\u226B", - "muchless": "\u226A", - "mufsquare": "\u338C", - "mugreek": "\u03BC", - "mugsquare": "\u338D", + "muchgreater": "\u226b", + "muchless": "\u226a", + "mufsquare": "\u338c", + "mugreek": "\u03bc", + "mugsquare": "\u338d", "muhiragana": "\u3080", - "mukatakana": "\u30E0", - "mukatakanahalfwidth": "\uFF91", + "mukatakana": "\u30e0", + "mukatakanahalfwidth": "\uff91", "mulsquare": "\u3395", - "multiply": "\u00D7", - "mumsquare": "\u339B", - "munahhebrew": "\u05A3", - "munahlefthebrew": "\u05A3", - "musicalnote": "\u266A", - "musicalnotedbl": "\u266B", - "musicflatsign": "\u266D", - "musicsharpsign": "\u266F", - "mussquare": "\u33B2", - "muvsquare": "\u33B6", - "muwsquare": "\u33BC", - "mvmegasquare": "\u33B9", - "mvsquare": "\u33B7", - "mwmegasquare": "\u33BF", - "mwsquare": "\u33BD", - "n": "\u006E", - "nabengali": "\u09A8", + "multiply": "\u00d7", + "mumsquare": "\u339b", + "munahhebrew": "\u05a3", + "munahlefthebrew": "\u05a3", + "musicalnote": "\u266a", + "musicalnotedbl": "\u266b", + "musicflatsign": "\u266d", + "musicsharpsign": "\u266f", + "mussquare": "\u33b2", + "muvsquare": "\u33b6", + "muwsquare": "\u33bc", + "mvmegasquare": "\u33b9", + "mvsquare": "\u33b7", + "mwmegasquare": "\u33bf", + "mwsquare": "\u33bd", + "n": "\u006e", + "nabengali": "\u09a8", "nabla": "\u2207", "nacute": "\u0144", "nadeva": "\u0928", - "nagujarati": "\u0AA8", - "nagurmukhi": "\u0A28", - "nahiragana": "\u306A", - "nakatakana": "\u30CA", - "nakatakanahalfwidth": "\uFF85", + "nagujarati": "\u0aa8", + "nagurmukhi": "\u0a28", + "nahiragana": "\u306a", + "nakatakana": "\u30ca", + "nakatakanahalfwidth": "\uff85", "napostrophe": "\u0149", "nasquare": "\u3381", - "nbopomofo": "\u310B", - "nbspace": "\u00A0", + "nbopomofo": "\u310b", + "nbspace": "\u00a0", "ncaron": "\u0148", "ncedilla": "\u0146", - "ncircle": "\u24DD", - "ncircumflexbelow": "\u1E4B", + "ncircle": "\u24dd", + "ncircumflexbelow": "\u1e4b", "ncommaaccent": "\u0146", - "ndotaccent": "\u1E45", - "ndotbelow": "\u1E47", - "nehiragana": "\u306D", - "nekatakana": "\u30CD", - "nekatakanahalfwidth": "\uFF88", - "newsheqelsign": "\u20AA", - "nfsquare": "\u338B", + "ndotaccent": "\u1e45", + "ndotbelow": "\u1e47", + "nehiragana": "\u306d", + "nekatakana": "\u30cd", + "nekatakanahalfwidth": "\uff88", + "newsheqelsign": "\u20aa", + "nfsquare": "\u338b", "ngabengali": "\u0999", "ngadeva": "\u0919", - "ngagujarati": "\u0A99", - "ngagurmukhi": "\u0A19", - "ngonguthai": "\u0E07", + "ngagujarati": "\u0a99", + "ngagurmukhi": "\u0a19", + "ngonguthai": "\u0e07", "nhiragana": "\u3093", "nhookleft": "\u0272", "nhookretroflex": "\u0273", - "nieunacirclekorean": "\u326F", - "nieunaparenkorean": "\u320F", + "nieunacirclekorean": "\u326f", + "nieunaparenkorean": "\u320f", "nieuncieuckorean": "\u3135", "nieuncirclekorean": "\u3261", "nieunhieuhkorean": "\u3136", @@ -2810,74 +2810,74 @@ def convert_glyphlist(path: str) -> None: "nieunparenkorean": "\u3201", "nieunsioskorean": "\u3167", "nieuntikeutkorean": "\u3166", - "nihiragana": "\u306B", - "nikatakana": "\u30CB", - "nikatakanahalfwidth": "\uFF86", - "nikhahitleftthai": "\uF899", - "nikhahitthai": "\u0E4D", + "nihiragana": "\u306b", + "nikatakana": "\u30cb", + "nikatakanahalfwidth": "\uff86", + "nikhahitleftthai": "\uf899", + "nikhahitthai": "\u0e4d", "nine": "\u0039", "ninearabic": "\u0669", - "ninebengali": "\u09EF", + "ninebengali": "\u09ef", "ninecircle": "\u2468", "ninecircleinversesansserif": "\u2792", - "ninedeva": "\u096F", - "ninegujarati": "\u0AEF", - "ninegurmukhi": "\u0A6F", + "ninedeva": "\u096f", + "ninegujarati": "\u0aef", + "ninegurmukhi": "\u0a6f", "ninehackarabic": "\u0669", "ninehangzhou": "\u3029", "nineideographicparen": "\u3228", "nineinferior": "\u2089", - "ninemonospace": "\uFF19", - "nineoldstyle": "\uF739", - "nineparen": "\u247C", + "ninemonospace": "\uff19", + "nineoldstyle": "\uf739", + "nineparen": "\u247c", "nineperiod": "\u2490", - "ninepersian": "\u06F9", + "ninepersian": "\u06f9", "nineroman": "\u2178", "ninesuperior": "\u2079", "nineteencircle": "\u2472", "nineteenparen": "\u2486", - "nineteenperiod": "\u249A", - "ninethai": "\u0E59", - "nj": "\u01CC", - "njecyrillic": "\u045A", - "nkatakana": "\u30F3", - "nkatakanahalfwidth": "\uFF9D", - "nlegrightlong": "\u019E", - "nlinebelow": "\u1E49", - "nmonospace": "\uFF4E", - "nmsquare": "\u339A", - "nnabengali": "\u09A3", + "nineteenperiod": "\u249a", + "ninethai": "\u0e59", + "nj": "\u01cc", + "njecyrillic": "\u045a", + "nkatakana": "\u30f3", + "nkatakanahalfwidth": "\uff9d", + "nlegrightlong": "\u019e", + "nlinebelow": "\u1e49", + "nmonospace": "\uff4e", + "nmsquare": "\u339a", + "nnabengali": "\u09a3", "nnadeva": "\u0923", - "nnagujarati": "\u0AA3", - "nnagurmukhi": "\u0A23", + "nnagujarati": "\u0aa3", + "nnagurmukhi": "\u0a23", "nnnadeva": "\u0929", - "nohiragana": "\u306E", - "nokatakana": "\u30CE", - "nokatakanahalfwidth": "\uFF89", - "nonbreakingspace": "\u00A0", - "nonenthai": "\u0E13", - "nonuthai": "\u0E19", + "nohiragana": "\u306e", + "nokatakana": "\u30ce", + "nokatakanahalfwidth": "\uff89", + "nonbreakingspace": "\u00a0", + "nonenthai": "\u0e13", + "nonuthai": "\u0e19", "noonarabic": "\u0646", - "noonfinalarabic": "\uFEE6", - "noonghunnaarabic": "\u06BA", - "noonghunnafinalarabic": "\uFB9F", - "noonhehinitialarabic": "\uFEE7\uFEEC", - "nooninitialarabic": "\uFEE7", - "noonjeeminitialarabic": "\uFCD2", - "noonjeemisolatedarabic": "\uFC4B", - "noonmedialarabic": "\uFEE8", - "noonmeeminitialarabic": "\uFCD5", - "noonmeemisolatedarabic": "\uFC4E", - "noonnoonfinalarabic": "\uFC8D", - "notcontains": "\u220C", + "noonfinalarabic": "\ufee6", + "noonghunnaarabic": "\u06ba", + "noonghunnafinalarabic": "\ufb9f", + "noonhehinitialarabic": "\ufee7\ufeec", + "nooninitialarabic": "\ufee7", + "noonjeeminitialarabic": "\ufcd2", + "noonjeemisolatedarabic": "\ufc4b", + "noonmedialarabic": "\ufee8", + "noonmeeminitialarabic": "\ufcd5", + "noonmeemisolatedarabic": "\ufc4e", + "noonnoonfinalarabic": "\ufc8d", + "notcontains": "\u220c", "notelement": "\u2209", "notelementof": "\u2209", "notequal": "\u2260", - "notgreater": "\u226F", + "notgreater": "\u226f", "notgreaternorequal": "\u2271", "notgreaternorless": "\u2279", "notidentical": "\u2262", - "notless": "\u226E", + "notless": "\u226e", "notlessnorequal": "\u2270", "notparallel": "\u2226", "notprecedes": "\u2280", @@ -2885,267 +2885,267 @@ def convert_glyphlist(path: str) -> None: "notsucceeds": "\u2281", "notsuperset": "\u2285", "nowarmenian": "\u0576", - "nparen": "\u24A9", - "nssquare": "\u33B1", - "nsuperior": "\u207F", - "ntilde": "\u00F1", - "nu": "\u03BD", - "nuhiragana": "\u306C", - "nukatakana": "\u30CC", - "nukatakanahalfwidth": "\uFF87", - "nuktabengali": "\u09BC", - "nuktadeva": "\u093C", - "nuktagujarati": "\u0ABC", - "nuktagurmukhi": "\u0A3C", + "nparen": "\u24a9", + "nssquare": "\u33b1", + "nsuperior": "\u207f", + "ntilde": "\u00f1", + "nu": "\u03bd", + "nuhiragana": "\u306c", + "nukatakana": "\u30cc", + "nukatakanahalfwidth": "\uff87", + "nuktabengali": "\u09bc", + "nuktadeva": "\u093c", + "nuktagujarati": "\u0abc", + "nuktagurmukhi": "\u0a3c", "numbersign": "\u0023", - "numbersignmonospace": "\uFF03", - "numbersignsmall": "\uFE5F", + "numbersignmonospace": "\uff03", + "numbersignsmall": "\ufe5f", "numeralsigngreek": "\u0374", "numeralsignlowergreek": "\u0375", "numero": "\u2116", - "nun": "\u05E0", - "nundagesh": "\uFB40", - "nundageshhebrew": "\uFB40", - "nunhebrew": "\u05E0", - "nvsquare": "\u33B5", - "nwsquare": "\u33BB", - "nyabengali": "\u099E", - "nyadeva": "\u091E", - "nyagujarati": "\u0A9E", - "nyagurmukhi": "\u0A1E", - "o": "\u006F", - "oacute": "\u00F3", - "oangthai": "\u0E2D", + "nun": "\u05e0", + "nundagesh": "\ufb40", + "nundageshhebrew": "\ufb40", + "nunhebrew": "\u05e0", + "nvsquare": "\u33b5", + "nwsquare": "\u33bb", + "nyabengali": "\u099e", + "nyadeva": "\u091e", + "nyagujarati": "\u0a9e", + "nyagurmukhi": "\u0a1e", + "o": "\u006f", + "oacute": "\u00f3", + "oangthai": "\u0e2d", "obarred": "\u0275", - "obarredcyrillic": "\u04E9", - "obarreddieresiscyrillic": "\u04EB", + "obarredcyrillic": "\u04e9", + "obarreddieresiscyrillic": "\u04eb", "obengali": "\u0993", - "obopomofo": "\u311B", - "obreve": "\u014F", + "obopomofo": "\u311b", + "obreve": "\u014f", "ocandradeva": "\u0911", - "ocandragujarati": "\u0A91", + "ocandragujarati": "\u0a91", "ocandravowelsigndeva": "\u0949", - "ocandravowelsigngujarati": "\u0AC9", - "ocaron": "\u01D2", - "ocircle": "\u24DE", - "ocircumflex": "\u00F4", - "ocircumflexacute": "\u1ED1", - "ocircumflexdotbelow": "\u1ED9", - "ocircumflexgrave": "\u1ED3", - "ocircumflexhookabove": "\u1ED5", - "ocircumflextilde": "\u1ED7", - "ocyrillic": "\u043E", + "ocandravowelsigngujarati": "\u0ac9", + "ocaron": "\u01d2", + "ocircle": "\u24de", + "ocircumflex": "\u00f4", + "ocircumflexacute": "\u1ed1", + "ocircumflexdotbelow": "\u1ed9", + "ocircumflexgrave": "\u1ed3", + "ocircumflexhookabove": "\u1ed5", + "ocircumflextilde": "\u1ed7", + "ocyrillic": "\u043e", "odblacute": "\u0151", - "odblgrave": "\u020D", + "odblgrave": "\u020d", "odeva": "\u0913", - "odieresis": "\u00F6", - "odieresiscyrillic": "\u04E7", - "odotbelow": "\u1ECD", + "odieresis": "\u00f6", + "odieresiscyrillic": "\u04e7", + "odotbelow": "\u1ecd", "oe": "\u0153", - "oekorean": "\u315A", - "ogonek": "\u02DB", + "oekorean": "\u315a", + "ogonek": "\u02db", "ogonekcmb": "\u0328", - "ograve": "\u00F2", - "ogujarati": "\u0A93", + "ograve": "\u00f2", + "ogujarati": "\u0a93", "oharmenian": "\u0585", - "ohiragana": "\u304A", - "ohookabove": "\u1ECF", - "ohorn": "\u01A1", - "ohornacute": "\u1EDB", - "ohorndotbelow": "\u1EE3", - "ohorngrave": "\u1EDD", - "ohornhookabove": "\u1EDF", - "ohorntilde": "\u1EE1", + "ohiragana": "\u304a", + "ohookabove": "\u1ecf", + "ohorn": "\u01a1", + "ohornacute": "\u1edb", + "ohorndotbelow": "\u1ee3", + "ohorngrave": "\u1edd", + "ohornhookabove": "\u1edf", + "ohorntilde": "\u1ee1", "ohungarumlaut": "\u0151", - "oi": "\u01A3", - "oinvertedbreve": "\u020F", - "okatakana": "\u30AA", - "okatakanahalfwidth": "\uFF75", + "oi": "\u01a3", + "oinvertedbreve": "\u020f", + "okatakana": "\u30aa", + "okatakanahalfwidth": "\uff75", "okorean": "\u3157", - "olehebrew": "\u05AB", - "omacron": "\u014D", - "omacronacute": "\u1E53", - "omacrongrave": "\u1E51", + "olehebrew": "\u05ab", + "omacron": "\u014d", + "omacronacute": "\u1e53", + "omacrongrave": "\u1e51", "omdeva": "\u0950", - "omega": "\u03C9", - "omega1": "\u03D6", + "omega": "\u03c9", + "omega1": "\u03d6", "omegacyrillic": "\u0461", "omegalatinclosed": "\u0277", - "omegaroundcyrillic": "\u047B", - "omegatitlocyrillic": "\u047D", - "omegatonos": "\u03CE", - "omgujarati": "\u0AD0", - "omicron": "\u03BF", - "omicrontonos": "\u03CC", - "omonospace": "\uFF4F", + "omegaroundcyrillic": "\u047b", + "omegatitlocyrillic": "\u047d", + "omegatonos": "\u03ce", + "omgujarati": "\u0ad0", + "omicron": "\u03bf", + "omicrontonos": "\u03cc", + "omonospace": "\uff4f", "one": "\u0031", "onearabic": "\u0661", - "onebengali": "\u09E7", + "onebengali": "\u09e7", "onecircle": "\u2460", - "onecircleinversesansserif": "\u278A", + "onecircleinversesansserif": "\u278a", "onedeva": "\u0967", "onedotenleader": "\u2024", - "oneeighth": "\u215B", - "onefitted": "\uF6DC", - "onegujarati": "\u0AE7", - "onegurmukhi": "\u0A67", + "oneeighth": "\u215b", + "onefitted": "\uf6dc", + "onegujarati": "\u0ae7", + "onegurmukhi": "\u0a67", "onehackarabic": "\u0661", - "onehalf": "\u00BD", + "onehalf": "\u00bd", "onehangzhou": "\u3021", "oneideographicparen": "\u3220", "oneinferior": "\u2081", - "onemonospace": "\uFF11", - "onenumeratorbengali": "\u09F4", - "oneoldstyle": "\uF731", + "onemonospace": "\uff11", + "onenumeratorbengali": "\u09f4", + "oneoldstyle": "\uf731", "oneparen": "\u2474", "oneperiod": "\u2488", - "onepersian": "\u06F1", - "onequarter": "\u00BC", + "onepersian": "\u06f1", + "onequarter": "\u00bc", "oneroman": "\u2170", - "onesuperior": "\u00B9", - "onethai": "\u0E51", + "onesuperior": "\u00b9", + "onethai": "\u0e51", "onethird": "\u2153", - "oogonek": "\u01EB", - "oogonekmacron": "\u01ED", - "oogurmukhi": "\u0A13", - "oomatragurmukhi": "\u0A4B", + "oogonek": "\u01eb", + "oogonekmacron": "\u01ed", + "oogurmukhi": "\u0a13", + "oomatragurmukhi": "\u0a4b", "oopen": "\u0254", - "oparen": "\u24AA", - "openbullet": "\u25E6", + "oparen": "\u24aa", + "openbullet": "\u25e6", "option": "\u2325", - "ordfeminine": "\u00AA", - "ordmasculine": "\u00BA", - "orthogonal": "\u221F", + "ordfeminine": "\u00aa", + "ordmasculine": "\u00ba", + "orthogonal": "\u221f", "oshortdeva": "\u0912", - "oshortvowelsigndeva": "\u094A", - "oslash": "\u00F8", - "oslashacute": "\u01FF", + "oshortvowelsigndeva": "\u094a", + "oslash": "\u00f8", + "oslashacute": "\u01ff", "osmallhiragana": "\u3049", - "osmallkatakana": "\u30A9", - "osmallkatakanahalfwidth": "\uFF6B", - "ostrokeacute": "\u01FF", - "osuperior": "\uF6F0", - "otcyrillic": "\u047F", - "otilde": "\u00F5", - "otildeacute": "\u1E4D", - "otildedieresis": "\u1E4F", + "osmallkatakana": "\u30a9", + "osmallkatakanahalfwidth": "\uff6b", + "ostrokeacute": "\u01ff", + "osuperior": "\uf6f0", + "otcyrillic": "\u047f", + "otilde": "\u00f5", + "otildeacute": "\u1e4d", + "otildedieresis": "\u1e4f", "oubopomofo": "\u3121", - "overline": "\u203E", - "overlinecenterline": "\uFE4A", + "overline": "\u203e", + "overlinecenterline": "\ufe4a", "overlinecmb": "\u0305", - "overlinedashed": "\uFE49", - "overlinedblwavy": "\uFE4C", - "overlinewavy": "\uFE4B", - "overscore": "\u00AF", - "ovowelsignbengali": "\u09CB", - "ovowelsigndeva": "\u094B", - "ovowelsigngujarati": "\u0ACB", + "overlinedashed": "\ufe49", + "overlinedblwavy": "\ufe4c", + "overlinewavy": "\ufe4b", + "overscore": "\u00af", + "ovowelsignbengali": "\u09cb", + "ovowelsigndeva": "\u094b", + "ovowelsigngujarati": "\u0acb", "p": "\u0070", "paampssquare": "\u3380", - "paasentosquare": "\u332B", - "pabengali": "\u09AA", - "pacute": "\u1E55", - "padeva": "\u092A", - "pagedown": "\u21DF", - "pageup": "\u21DE", - "pagujarati": "\u0AAA", - "pagurmukhi": "\u0A2A", + "paasentosquare": "\u332b", + "pabengali": "\u09aa", + "pacute": "\u1e55", + "padeva": "\u092a", + "pagedown": "\u21df", + "pageup": "\u21de", + "pagujarati": "\u0aaa", + "pagurmukhi": "\u0a2a", "pahiragana": "\u3071", - "paiyannoithai": "\u0E2F", - "pakatakana": "\u30D1", + "paiyannoithai": "\u0e2f", + "pakatakana": "\u30d1", "palatalizationcyrilliccmb": "\u0484", - "palochkacyrillic": "\u04C0", - "pansioskorean": "\u317F", - "paragraph": "\u00B6", + "palochkacyrillic": "\u04c0", + "pansioskorean": "\u317f", + "paragraph": "\u00b6", "parallel": "\u2225", "parenleft": "\u0028", - "parenleftaltonearabic": "\uFD3E", - "parenleftbt": "\uF8ED", - "parenleftex": "\uF8EC", - "parenleftinferior": "\u208D", - "parenleftmonospace": "\uFF08", - "parenleftsmall": "\uFE59", - "parenleftsuperior": "\u207D", - "parenlefttp": "\uF8EB", - "parenleftvertical": "\uFE35", + "parenleftaltonearabic": "\ufd3e", + "parenleftbt": "\uf8ed", + "parenleftex": "\uf8ec", + "parenleftinferior": "\u208d", + "parenleftmonospace": "\uff08", + "parenleftsmall": "\ufe59", + "parenleftsuperior": "\u207d", + "parenlefttp": "\uf8eb", + "parenleftvertical": "\ufe35", "parenright": "\u0029", - "parenrightaltonearabic": "\uFD3F", - "parenrightbt": "\uF8F8", - "parenrightex": "\uF8F7", - "parenrightinferior": "\u208E", - "parenrightmonospace": "\uFF09", - "parenrightsmall": "\uFE5A", - "parenrightsuperior": "\u207E", - "parenrighttp": "\uF8F6", - "parenrightvertical": "\uFE36", + "parenrightaltonearabic": "\ufd3f", + "parenrightbt": "\uf8f8", + "parenrightex": "\uf8f7", + "parenrightinferior": "\u208e", + "parenrightmonospace": "\uff09", + "parenrightsmall": "\ufe5a", + "parenrightsuperior": "\u207e", + "parenrighttp": "\uf8f6", + "parenrightvertical": "\ufe36", "partialdiff": "\u2202", - "paseqhebrew": "\u05C0", + "paseqhebrew": "\u05c0", "pashtahebrew": "\u0599", - "pasquare": "\u33A9", - "patah": "\u05B7", - "patah11": "\u05B7", - "patah1d": "\u05B7", - "patah2a": "\u05B7", - "patahhebrew": "\u05B7", - "patahnarrowhebrew": "\u05B7", - "patahquarterhebrew": "\u05B7", - "patahwidehebrew": "\u05B7", - "pazerhebrew": "\u05A1", + "pasquare": "\u33a9", + "patah": "\u05b7", + "patah11": "\u05b7", + "patah1d": "\u05b7", + "patah2a": "\u05b7", + "patahhebrew": "\u05b7", + "patahnarrowhebrew": "\u05b7", + "patahquarterhebrew": "\u05b7", + "patahwidehebrew": "\u05b7", + "pazerhebrew": "\u05a1", "pbopomofo": "\u3106", - "pcircle": "\u24DF", - "pdotaccent": "\u1E57", - "pe": "\u05E4", - "pecyrillic": "\u043F", - "pedagesh": "\uFB44", - "pedageshhebrew": "\uFB44", - "peezisquare": "\u333B", - "pefinaldageshhebrew": "\uFB43", - "peharabic": "\u067E", - "peharmenian": "\u057A", - "pehebrew": "\u05E4", - "pehfinalarabic": "\uFB57", - "pehinitialarabic": "\uFB58", - "pehiragana": "\u307A", - "pehmedialarabic": "\uFB59", - "pekatakana": "\u30DA", - "pemiddlehookcyrillic": "\u04A7", - "perafehebrew": "\uFB4E", + "pcircle": "\u24df", + "pdotaccent": "\u1e57", + "pe": "\u05e4", + "pecyrillic": "\u043f", + "pedagesh": "\ufb44", + "pedageshhebrew": "\ufb44", + "peezisquare": "\u333b", + "pefinaldageshhebrew": "\ufb43", + "peharabic": "\u067e", + "peharmenian": "\u057a", + "pehebrew": "\u05e4", + "pehfinalarabic": "\ufb57", + "pehinitialarabic": "\ufb58", + "pehiragana": "\u307a", + "pehmedialarabic": "\ufb59", + "pekatakana": "\u30da", + "pemiddlehookcyrillic": "\u04a7", + "perafehebrew": "\ufb4e", "percent": "\u0025", - "percentarabic": "\u066A", - "percentmonospace": "\uFF05", - "percentsmall": "\uFE6A", - "period": "\u002E", + "percentarabic": "\u066a", + "percentmonospace": "\uff05", + "percentsmall": "\ufe6a", + "period": "\u002e", "periodarmenian": "\u0589", - "periodcentered": "\u00B7", - "periodhalfwidth": "\uFF61", - "periodinferior": "\uF6E7", - "periodmonospace": "\uFF0E", - "periodsmall": "\uFE52", - "periodsuperior": "\uF6E8", + "periodcentered": "\u00b7", + "periodhalfwidth": "\uff61", + "periodinferior": "\uf6e7", + "periodmonospace": "\uff0e", + "periodsmall": "\ufe52", + "periodsuperior": "\uf6e8", "perispomenigreekcmb": "\u0342", - "perpendicular": "\u22A5", + "perpendicular": "\u22a5", "perthousand": "\u2030", - "peseta": "\u20A7", - "pfsquare": "\u338A", - "phabengali": "\u09AB", - "phadeva": "\u092B", - "phagujarati": "\u0AAB", - "phagurmukhi": "\u0A2B", - "phi": "\u03C6", - "phi1": "\u03D5", - "phieuphacirclekorean": "\u327A", - "phieuphaparenkorean": "\u321A", - "phieuphcirclekorean": "\u326C", - "phieuphkorean": "\u314D", - "phieuphparenkorean": "\u320C", + "peseta": "\u20a7", + "pfsquare": "\u338a", + "phabengali": "\u09ab", + "phadeva": "\u092b", + "phagujarati": "\u0aab", + "phagurmukhi": "\u0a2b", + "phi": "\u03c6", + "phi1": "\u03d5", + "phieuphacirclekorean": "\u327a", + "phieuphaparenkorean": "\u321a", + "phieuphcirclekorean": "\u326c", + "phieuphkorean": "\u314d", + "phieuphparenkorean": "\u320c", "philatin": "\u0278", - "phinthuthai": "\u0E3A", - "phisymbolgreek": "\u03D5", - "phook": "\u01A5", - "phophanthai": "\u0E1E", - "phophungthai": "\u0E1C", - "phosamphaothai": "\u0E20", - "pi": "\u03C0", + "phinthuthai": "\u0e3a", + "phisymbolgreek": "\u03d5", + "phook": "\u01a5", + "phophanthai": "\u0e1e", + "phophungthai": "\u0e1c", + "phosamphaothai": "\u0e20", + "pi": "\u03c0", "pieupacirclekorean": "\u3273", "pieupaparenkorean": "\u3213", "pieupcieuckorean": "\u3176", @@ -3159,535 +3159,535 @@ def convert_glyphlist(path: str) -> None: "pieupthieuthkorean": "\u3177", "pieuptikeutkorean": "\u3173", "pihiragana": "\u3074", - "pikatakana": "\u30D4", - "pisymbolgreek": "\u03D6", + "pikatakana": "\u30d4", + "pisymbolgreek": "\u03d6", "piwrarmenian": "\u0583", - "plus": "\u002B", - "plusbelowcmb": "\u031F", + "plus": "\u002b", + "plusbelowcmb": "\u031f", "pluscircle": "\u2295", - "plusminus": "\u00B1", - "plusmod": "\u02D6", - "plusmonospace": "\uFF0B", - "plussmall": "\uFE62", - "plussuperior": "\u207A", - "pmonospace": "\uFF50", - "pmsquare": "\u33D8", - "pohiragana": "\u307D", - "pointingindexdownwhite": "\u261F", - "pointingindexleftwhite": "\u261C", - "pointingindexrightwhite": "\u261E", - "pointingindexupwhite": "\u261D", - "pokatakana": "\u30DD", - "poplathai": "\u0E1B", + "plusminus": "\u00b1", + "plusmod": "\u02d6", + "plusmonospace": "\uff0b", + "plussmall": "\ufe62", + "plussuperior": "\u207a", + "pmonospace": "\uff50", + "pmsquare": "\u33d8", + "pohiragana": "\u307d", + "pointingindexdownwhite": "\u261f", + "pointingindexleftwhite": "\u261c", + "pointingindexrightwhite": "\u261e", + "pointingindexupwhite": "\u261d", + "pokatakana": "\u30dd", + "poplathai": "\u0e1b", "postalmark": "\u3012", "postalmarkface": "\u3020", - "pparen": "\u24AB", - "precedes": "\u227A", - "prescription": "\u211E", - "primemod": "\u02B9", + "pparen": "\u24ab", + "precedes": "\u227a", + "prescription": "\u211e", + "primemod": "\u02b9", "primereversed": "\u2035", - "product": "\u220F", + "product": "\u220f", "projective": "\u2305", - "prolongedkana": "\u30FC", + "prolongedkana": "\u30fc", "propellor": "\u2318", "propersubset": "\u2282", "propersuperset": "\u2283", "proportion": "\u2237", - "proportional": "\u221D", - "psi": "\u03C8", + "proportional": "\u221d", + "psi": "\u03c8", "psicyrillic": "\u0471", "psilipneumatacyrilliccmb": "\u0486", - "pssquare": "\u33B0", + "pssquare": "\u33b0", "puhiragana": "\u3077", - "pukatakana": "\u30D7", - "pvsquare": "\u33B4", - "pwsquare": "\u33BA", + "pukatakana": "\u30d7", + "pvsquare": "\u33b4", + "pwsquare": "\u33ba", "q": "\u0071", "qadeva": "\u0958", - "qadmahebrew": "\u05A8", + "qadmahebrew": "\u05a8", "qafarabic": "\u0642", - "qaffinalarabic": "\uFED6", - "qafinitialarabic": "\uFED7", - "qafmedialarabic": "\uFED8", - "qamats": "\u05B8", - "qamats10": "\u05B8", - "qamats1a": "\u05B8", - "qamats1c": "\u05B8", - "qamats27": "\u05B8", - "qamats29": "\u05B8", - "qamats33": "\u05B8", - "qamatsde": "\u05B8", - "qamatshebrew": "\u05B8", - "qamatsnarrowhebrew": "\u05B8", - "qamatsqatanhebrew": "\u05B8", - "qamatsqatannarrowhebrew": "\u05B8", - "qamatsqatanquarterhebrew": "\u05B8", - "qamatsqatanwidehebrew": "\u05B8", - "qamatsquarterhebrew": "\u05B8", - "qamatswidehebrew": "\u05B8", - "qarneyparahebrew": "\u059F", + "qaffinalarabic": "\ufed6", + "qafinitialarabic": "\ufed7", + "qafmedialarabic": "\ufed8", + "qamats": "\u05b8", + "qamats10": "\u05b8", + "qamats1a": "\u05b8", + "qamats1c": "\u05b8", + "qamats27": "\u05b8", + "qamats29": "\u05b8", + "qamats33": "\u05b8", + "qamatsde": "\u05b8", + "qamatshebrew": "\u05b8", + "qamatsnarrowhebrew": "\u05b8", + "qamatsqatanhebrew": "\u05b8", + "qamatsqatannarrowhebrew": "\u05b8", + "qamatsqatanquarterhebrew": "\u05b8", + "qamatsqatanwidehebrew": "\u05b8", + "qamatsquarterhebrew": "\u05b8", + "qamatswidehebrew": "\u05b8", + "qarneyparahebrew": "\u059f", "qbopomofo": "\u3111", - "qcircle": "\u24E0", - "qhook": "\u02A0", - "qmonospace": "\uFF51", - "qof": "\u05E7", - "qofdagesh": "\uFB47", - "qofdageshhebrew": "\uFB47", - "qofhatafpatah": "\u05E7\u05B2", - "qofhatafpatahhebrew": "\u05E7\u05B2", - "qofhatafsegol": "\u05E7\u05B1", - "qofhatafsegolhebrew": "\u05E7\u05B1", - "qofhebrew": "\u05E7", - "qofhiriq": "\u05E7\u05B4", - "qofhiriqhebrew": "\u05E7\u05B4", - "qofholam": "\u05E7\u05B9", - "qofholamhebrew": "\u05E7\u05B9", - "qofpatah": "\u05E7\u05B7", - "qofpatahhebrew": "\u05E7\u05B7", - "qofqamats": "\u05E7\u05B8", - "qofqamatshebrew": "\u05E7\u05B8", - "qofqubuts": "\u05E7\u05BB", - "qofqubutshebrew": "\u05E7\u05BB", - "qofsegol": "\u05E7\u05B6", - "qofsegolhebrew": "\u05E7\u05B6", - "qofsheva": "\u05E7\u05B0", - "qofshevahebrew": "\u05E7\u05B0", - "qoftsere": "\u05E7\u05B5", - "qoftserehebrew": "\u05E7\u05B5", - "qparen": "\u24AC", + "qcircle": "\u24e0", + "qhook": "\u02a0", + "qmonospace": "\uff51", + "qof": "\u05e7", + "qofdagesh": "\ufb47", + "qofdageshhebrew": "\ufb47", + "qofhatafpatah": "\u05e7\u05b2", + "qofhatafpatahhebrew": "\u05e7\u05b2", + "qofhatafsegol": "\u05e7\u05b1", + "qofhatafsegolhebrew": "\u05e7\u05b1", + "qofhebrew": "\u05e7", + "qofhiriq": "\u05e7\u05b4", + "qofhiriqhebrew": "\u05e7\u05b4", + "qofholam": "\u05e7\u05b9", + "qofholamhebrew": "\u05e7\u05b9", + "qofpatah": "\u05e7\u05b7", + "qofpatahhebrew": "\u05e7\u05b7", + "qofqamats": "\u05e7\u05b8", + "qofqamatshebrew": "\u05e7\u05b8", + "qofqubuts": "\u05e7\u05bb", + "qofqubutshebrew": "\u05e7\u05bb", + "qofsegol": "\u05e7\u05b6", + "qofsegolhebrew": "\u05e7\u05b6", + "qofsheva": "\u05e7\u05b0", + "qofshevahebrew": "\u05e7\u05b0", + "qoftsere": "\u05e7\u05b5", + "qoftserehebrew": "\u05e7\u05b5", + "qparen": "\u24ac", "quarternote": "\u2669", - "qubuts": "\u05BB", - "qubuts18": "\u05BB", - "qubuts25": "\u05BB", - "qubuts31": "\u05BB", - "qubutshebrew": "\u05BB", - "qubutsnarrowhebrew": "\u05BB", - "qubutsquarterhebrew": "\u05BB", - "qubutswidehebrew": "\u05BB", - "question": "\u003F", - "questionarabic": "\u061F", - "questionarmenian": "\u055E", - "questiondown": "\u00BF", - "questiondownsmall": "\uF7BF", - "questiongreek": "\u037E", - "questionmonospace": "\uFF1F", - "questionsmall": "\uF73F", + "qubuts": "\u05bb", + "qubuts18": "\u05bb", + "qubuts25": "\u05bb", + "qubuts31": "\u05bb", + "qubutshebrew": "\u05bb", + "qubutsnarrowhebrew": "\u05bb", + "qubutsquarterhebrew": "\u05bb", + "qubutswidehebrew": "\u05bb", + "question": "\u003f", + "questionarabic": "\u061f", + "questionarmenian": "\u055e", + "questiondown": "\u00bf", + "questiondownsmall": "\uf7bf", + "questiongreek": "\u037e", + "questionmonospace": "\uff1f", + "questionsmall": "\uf73f", "quotedbl": "\u0022", - "quotedblbase": "\u201E", - "quotedblleft": "\u201C", - "quotedblmonospace": "\uFF02", - "quotedblprime": "\u301E", - "quotedblprimereversed": "\u301D", - "quotedblright": "\u201D", + "quotedblbase": "\u201e", + "quotedblleft": "\u201c", + "quotedblmonospace": "\uff02", + "quotedblprime": "\u301e", + "quotedblprimereversed": "\u301d", + "quotedblright": "\u201d", "quoteleft": "\u2018", - "quoteleftreversed": "\u201B", - "quotereversed": "\u201B", + "quoteleftreversed": "\u201b", + "quotereversed": "\u201b", "quoteright": "\u2019", "quoterightn": "\u0149", - "quotesinglbase": "\u201A", + "quotesinglbase": "\u201a", "quotesingle": "\u0027", - "quotesinglemonospace": "\uFF07", + "quotesinglemonospace": "\uff07", "r": "\u0072", - "raarmenian": "\u057C", - "rabengali": "\u09B0", + "raarmenian": "\u057c", + "rabengali": "\u09b0", "racute": "\u0155", "radeva": "\u0930", - "radical": "\u221A", - "radicalex": "\uF8E5", - "radoverssquare": "\u33AE", - "radoverssquaredsquare": "\u33AF", - "radsquare": "\u33AD", - "rafe": "\u05BF", - "rafehebrew": "\u05BF", - "ragujarati": "\u0AB0", - "ragurmukhi": "\u0A30", + "radical": "\u221a", + "radicalex": "\uf8e5", + "radoverssquare": "\u33ae", + "radoverssquaredsquare": "\u33af", + "radsquare": "\u33ad", + "rafe": "\u05bf", + "rafehebrew": "\u05bf", + "ragujarati": "\u0ab0", + "ragurmukhi": "\u0a30", "rahiragana": "\u3089", - "rakatakana": "\u30E9", - "rakatakanahalfwidth": "\uFF97", - "ralowerdiagonalbengali": "\u09F1", - "ramiddlediagonalbengali": "\u09F0", + "rakatakana": "\u30e9", + "rakatakanahalfwidth": "\uff97", + "ralowerdiagonalbengali": "\u09f1", + "ramiddlediagonalbengali": "\u09f0", "ramshorn": "\u0264", "ratio": "\u2236", "rbopomofo": "\u3116", "rcaron": "\u0159", "rcedilla": "\u0157", - "rcircle": "\u24E1", + "rcircle": "\u24e1", "rcommaaccent": "\u0157", "rdblgrave": "\u0211", - "rdotaccent": "\u1E59", - "rdotbelow": "\u1E5B", - "rdotbelowmacron": "\u1E5D", - "referencemark": "\u203B", + "rdotaccent": "\u1e59", + "rdotbelow": "\u1e5b", + "rdotbelowmacron": "\u1e5d", + "referencemark": "\u203b", "reflexsubset": "\u2286", "reflexsuperset": "\u2287", - "registered": "\u00AE", - "registersans": "\uF8E8", - "registerserif": "\uF6DA", + "registered": "\u00ae", + "registersans": "\uf8e8", + "registerserif": "\uf6da", "reharabic": "\u0631", "reharmenian": "\u0580", - "rehfinalarabic": "\uFEAE", - "rehiragana": "\u308C", - "rehyehaleflamarabic": "\u0631\uFEF3\uFE8E\u0644", - "rekatakana": "\u30EC", - "rekatakanahalfwidth": "\uFF9A", - "resh": "\u05E8", - "reshdageshhebrew": "\uFB48", - "reshhatafpatah": "\u05E8\u05B2", - "reshhatafpatahhebrew": "\u05E8\u05B2", - "reshhatafsegol": "\u05E8\u05B1", - "reshhatafsegolhebrew": "\u05E8\u05B1", - "reshhebrew": "\u05E8", - "reshhiriq": "\u05E8\u05B4", - "reshhiriqhebrew": "\u05E8\u05B4", - "reshholam": "\u05E8\u05B9", - "reshholamhebrew": "\u05E8\u05B9", - "reshpatah": "\u05E8\u05B7", - "reshpatahhebrew": "\u05E8\u05B7", - "reshqamats": "\u05E8\u05B8", - "reshqamatshebrew": "\u05E8\u05B8", - "reshqubuts": "\u05E8\u05BB", - "reshqubutshebrew": "\u05E8\u05BB", - "reshsegol": "\u05E8\u05B6", - "reshsegolhebrew": "\u05E8\u05B6", - "reshsheva": "\u05E8\u05B0", - "reshshevahebrew": "\u05E8\u05B0", - "reshtsere": "\u05E8\u05B5", - "reshtserehebrew": "\u05E8\u05B5", - "reversedtilde": "\u223D", + "rehfinalarabic": "\ufeae", + "rehiragana": "\u308c", + "rehyehaleflamarabic": "\u0631\ufef3\ufe8e\u0644", + "rekatakana": "\u30ec", + "rekatakanahalfwidth": "\uff9a", + "resh": "\u05e8", + "reshdageshhebrew": "\ufb48", + "reshhatafpatah": "\u05e8\u05b2", + "reshhatafpatahhebrew": "\u05e8\u05b2", + "reshhatafsegol": "\u05e8\u05b1", + "reshhatafsegolhebrew": "\u05e8\u05b1", + "reshhebrew": "\u05e8", + "reshhiriq": "\u05e8\u05b4", + "reshhiriqhebrew": "\u05e8\u05b4", + "reshholam": "\u05e8\u05b9", + "reshholamhebrew": "\u05e8\u05b9", + "reshpatah": "\u05e8\u05b7", + "reshpatahhebrew": "\u05e8\u05b7", + "reshqamats": "\u05e8\u05b8", + "reshqamatshebrew": "\u05e8\u05b8", + "reshqubuts": "\u05e8\u05bb", + "reshqubutshebrew": "\u05e8\u05bb", + "reshsegol": "\u05e8\u05b6", + "reshsegolhebrew": "\u05e8\u05b6", + "reshsheva": "\u05e8\u05b0", + "reshshevahebrew": "\u05e8\u05b0", + "reshtsere": "\u05e8\u05b5", + "reshtserehebrew": "\u05e8\u05b5", + "reversedtilde": "\u223d", "reviahebrew": "\u0597", "reviamugrashhebrew": "\u0597", "revlogicalnot": "\u2310", - "rfishhook": "\u027E", - "rfishhookreversed": "\u027F", - "rhabengali": "\u09DD", - "rhadeva": "\u095D", - "rho": "\u03C1", - "rhook": "\u027D", - "rhookturned": "\u027B", - "rhookturnedsuperior": "\u02B5", - "rhosymbolgreek": "\u03F1", - "rhotichookmod": "\u02DE", + "rfishhook": "\u027e", + "rfishhookreversed": "\u027f", + "rhabengali": "\u09dd", + "rhadeva": "\u095d", + "rho": "\u03c1", + "rhook": "\u027d", + "rhookturned": "\u027b", + "rhookturnedsuperior": "\u02b5", + "rhosymbolgreek": "\u03f1", + "rhotichookmod": "\u02de", "rieulacirclekorean": "\u3271", "rieulaparenkorean": "\u3211", "rieulcirclekorean": "\u3263", "rieulhieuhkorean": "\u3140", - "rieulkiyeokkorean": "\u313A", + "rieulkiyeokkorean": "\u313a", "rieulkiyeoksioskorean": "\u3169", "rieulkorean": "\u3139", - "rieulmieumkorean": "\u313B", - "rieulpansioskorean": "\u316C", + "rieulmieumkorean": "\u313b", + "rieulpansioskorean": "\u316c", "rieulparenkorean": "\u3203", - "rieulphieuphkorean": "\u313F", - "rieulpieupkorean": "\u313C", - "rieulpieupsioskorean": "\u316B", - "rieulsioskorean": "\u313D", - "rieulthieuthkorean": "\u313E", - "rieultikeutkorean": "\u316A", - "rieulyeorinhieuhkorean": "\u316D", - "rightangle": "\u221F", + "rieulphieuphkorean": "\u313f", + "rieulpieupkorean": "\u313c", + "rieulpieupsioskorean": "\u316b", + "rieulsioskorean": "\u313d", + "rieulthieuthkorean": "\u313e", + "rieultikeutkorean": "\u316a", + "rieulyeorinhieuhkorean": "\u316d", + "rightangle": "\u221f", "righttackbelowcmb": "\u0319", - "righttriangle": "\u22BF", - "rihiragana": "\u308A", - "rikatakana": "\u30EA", - "rikatakanahalfwidth": "\uFF98", - "ring": "\u02DA", + "righttriangle": "\u22bf", + "rihiragana": "\u308a", + "rikatakana": "\u30ea", + "rikatakanahalfwidth": "\uff98", + "ring": "\u02da", "ringbelowcmb": "\u0325", - "ringcmb": "\u030A", - "ringhalfleft": "\u02BF", + "ringcmb": "\u030a", + "ringhalfleft": "\u02bf", "ringhalfleftarmenian": "\u0559", - "ringhalfleftbelowcmb": "\u031C", - "ringhalfleftcentered": "\u02D3", - "ringhalfright": "\u02BE", + "ringhalfleftbelowcmb": "\u031c", + "ringhalfleftcentered": "\u02d3", + "ringhalfright": "\u02be", "ringhalfrightbelowcmb": "\u0339", - "ringhalfrightcentered": "\u02D2", + "ringhalfrightcentered": "\u02d2", "rinvertedbreve": "\u0213", "rittorusquare": "\u3351", - "rlinebelow": "\u1E5F", - "rlongleg": "\u027C", - "rlonglegturned": "\u027A", - "rmonospace": "\uFF52", - "rohiragana": "\u308D", - "rokatakana": "\u30ED", - "rokatakanahalfwidth": "\uFF9B", - "roruathai": "\u0E23", - "rparen": "\u24AD", - "rrabengali": "\u09DC", + "rlinebelow": "\u1e5f", + "rlongleg": "\u027c", + "rlonglegturned": "\u027a", + "rmonospace": "\uff52", + "rohiragana": "\u308d", + "rokatakana": "\u30ed", + "rokatakanahalfwidth": "\uff9b", + "roruathai": "\u0e23", + "rparen": "\u24ad", + "rrabengali": "\u09dc", "rradeva": "\u0931", - "rragurmukhi": "\u0A5C", + "rragurmukhi": "\u0a5c", "rreharabic": "\u0691", - "rrehfinalarabic": "\uFB8D", - "rrvocalicbengali": "\u09E0", + "rrehfinalarabic": "\ufb8d", + "rrvocalicbengali": "\u09e0", "rrvocalicdeva": "\u0960", - "rrvocalicgujarati": "\u0AE0", - "rrvocalicvowelsignbengali": "\u09C4", + "rrvocalicgujarati": "\u0ae0", + "rrvocalicvowelsignbengali": "\u09c4", "rrvocalicvowelsigndeva": "\u0944", - "rrvocalicvowelsigngujarati": "\u0AC4", - "rsuperior": "\uF6F1", + "rrvocalicvowelsigngujarati": "\u0ac4", + "rsuperior": "\uf6f1", "rtblock": "\u2590", "rturned": "\u0279", - "rturnedsuperior": "\u02B4", - "ruhiragana": "\u308B", - "rukatakana": "\u30EB", - "rukatakanahalfwidth": "\uFF99", - "rupeemarkbengali": "\u09F2", - "rupeesignbengali": "\u09F3", - "rupiah": "\uF6DD", - "ruthai": "\u0E24", - "rvocalicbengali": "\u098B", - "rvocalicdeva": "\u090B", - "rvocalicgujarati": "\u0A8B", - "rvocalicvowelsignbengali": "\u09C3", + "rturnedsuperior": "\u02b4", + "ruhiragana": "\u308b", + "rukatakana": "\u30eb", + "rukatakanahalfwidth": "\uff99", + "rupeemarkbengali": "\u09f2", + "rupeesignbengali": "\u09f3", + "rupiah": "\uf6dd", + "ruthai": "\u0e24", + "rvocalicbengali": "\u098b", + "rvocalicdeva": "\u090b", + "rvocalicgujarati": "\u0a8b", + "rvocalicvowelsignbengali": "\u09c3", "rvocalicvowelsigndeva": "\u0943", - "rvocalicvowelsigngujarati": "\u0AC3", + "rvocalicvowelsigngujarati": "\u0ac3", "s": "\u0073", - "sabengali": "\u09B8", - "sacute": "\u015B", - "sacutedotaccent": "\u1E65", + "sabengali": "\u09b8", + "sacute": "\u015b", + "sacutedotaccent": "\u1e65", "sadarabic": "\u0635", "sadeva": "\u0938", - "sadfinalarabic": "\uFEBA", - "sadinitialarabic": "\uFEBB", - "sadmedialarabic": "\uFEBC", - "sagujarati": "\u0AB8", - "sagurmukhi": "\u0A38", + "sadfinalarabic": "\ufeba", + "sadinitialarabic": "\ufebb", + "sadmedialarabic": "\ufebc", + "sagujarati": "\u0ab8", + "sagurmukhi": "\u0a38", "sahiragana": "\u3055", - "sakatakana": "\u30B5", - "sakatakanahalfwidth": "\uFF7B", - "sallallahoualayhewasallamarabic": "\uFDFA", - "samekh": "\u05E1", - "samekhdagesh": "\uFB41", - "samekhdageshhebrew": "\uFB41", - "samekhhebrew": "\u05E1", - "saraaathai": "\u0E32", - "saraaethai": "\u0E41", - "saraaimaimalaithai": "\u0E44", - "saraaimaimuanthai": "\u0E43", - "saraamthai": "\u0E33", - "saraathai": "\u0E30", - "saraethai": "\u0E40", - "saraiileftthai": "\uF886", - "saraiithai": "\u0E35", - "saraileftthai": "\uF885", - "saraithai": "\u0E34", - "saraothai": "\u0E42", - "saraueeleftthai": "\uF888", - "saraueethai": "\u0E37", - "saraueleftthai": "\uF887", - "sarauethai": "\u0E36", - "sarauthai": "\u0E38", - "sarauuthai": "\u0E39", + "sakatakana": "\u30b5", + "sakatakanahalfwidth": "\uff7b", + "sallallahoualayhewasallamarabic": "\ufdfa", + "samekh": "\u05e1", + "samekhdagesh": "\ufb41", + "samekhdageshhebrew": "\ufb41", + "samekhhebrew": "\u05e1", + "saraaathai": "\u0e32", + "saraaethai": "\u0e41", + "saraaimaimalaithai": "\u0e44", + "saraaimaimuanthai": "\u0e43", + "saraamthai": "\u0e33", + "saraathai": "\u0e30", + "saraethai": "\u0e40", + "saraiileftthai": "\uf886", + "saraiithai": "\u0e35", + "saraileftthai": "\uf885", + "saraithai": "\u0e34", + "saraothai": "\u0e42", + "saraueeleftthai": "\uf888", + "saraueethai": "\u0e37", + "saraueleftthai": "\uf887", + "sarauethai": "\u0e36", + "sarauthai": "\u0e38", + "sarauuthai": "\u0e39", "sbopomofo": "\u3119", "scaron": "\u0161", - "scarondotaccent": "\u1E67", - "scedilla": "\u015F", + "scarondotaccent": "\u1e67", + "scedilla": "\u015f", "schwa": "\u0259", - "schwacyrillic": "\u04D9", - "schwadieresiscyrillic": "\u04DB", - "schwahook": "\u025A", - "scircle": "\u24E2", - "scircumflex": "\u015D", + "schwacyrillic": "\u04d9", + "schwadieresiscyrillic": "\u04db", + "schwahook": "\u025a", + "scircle": "\u24e2", + "scircumflex": "\u015d", "scommaaccent": "\u0219", - "sdotaccent": "\u1E61", - "sdotbelow": "\u1E63", - "sdotbelowdotaccent": "\u1E69", - "seagullbelowcmb": "\u033C", + "sdotaccent": "\u1e61", + "sdotbelow": "\u1e63", + "sdotbelowdotaccent": "\u1e69", + "seagullbelowcmb": "\u033c", "second": "\u2033", - "secondtonechinese": "\u02CA", - "section": "\u00A7", + "secondtonechinese": "\u02ca", + "section": "\u00a7", "seenarabic": "\u0633", - "seenfinalarabic": "\uFEB2", - "seeninitialarabic": "\uFEB3", - "seenmedialarabic": "\uFEB4", - "segol": "\u05B6", - "segol13": "\u05B6", - "segol1f": "\u05B6", - "segol2c": "\u05B6", - "segolhebrew": "\u05B6", - "segolnarrowhebrew": "\u05B6", - "segolquarterhebrew": "\u05B6", + "seenfinalarabic": "\ufeb2", + "seeninitialarabic": "\ufeb3", + "seenmedialarabic": "\ufeb4", + "segol": "\u05b6", + "segol13": "\u05b6", + "segol1f": "\u05b6", + "segol2c": "\u05b6", + "segolhebrew": "\u05b6", + "segolnarrowhebrew": "\u05b6", + "segolquarterhebrew": "\u05b6", "segoltahebrew": "\u0592", - "segolwidehebrew": "\u05B6", - "seharmenian": "\u057D", - "sehiragana": "\u305B", - "sekatakana": "\u30BB", - "sekatakanahalfwidth": "\uFF7E", - "semicolon": "\u003B", - "semicolonarabic": "\u061B", - "semicolonmonospace": "\uFF1B", - "semicolonsmall": "\uFE54", - "semivoicedmarkkana": "\u309C", - "semivoicedmarkkanahalfwidth": "\uFF9F", + "segolwidehebrew": "\u05b6", + "seharmenian": "\u057d", + "sehiragana": "\u305b", + "sekatakana": "\u30bb", + "sekatakanahalfwidth": "\uff7e", + "semicolon": "\u003b", + "semicolonarabic": "\u061b", + "semicolonmonospace": "\uff1b", + "semicolonsmall": "\ufe54", + "semivoicedmarkkana": "\u309c", + "semivoicedmarkkanahalfwidth": "\uff9f", "sentisquare": "\u3322", "sentosquare": "\u3323", "seven": "\u0037", "sevenarabic": "\u0667", - "sevenbengali": "\u09ED", + "sevenbengali": "\u09ed", "sevencircle": "\u2466", "sevencircleinversesansserif": "\u2790", - "sevendeva": "\u096D", - "seveneighths": "\u215E", - "sevengujarati": "\u0AED", - "sevengurmukhi": "\u0A6D", + "sevendeva": "\u096d", + "seveneighths": "\u215e", + "sevengujarati": "\u0aed", + "sevengurmukhi": "\u0a6d", "sevenhackarabic": "\u0667", "sevenhangzhou": "\u3027", "sevenideographicparen": "\u3226", "seveninferior": "\u2087", - "sevenmonospace": "\uFF17", - "sevenoldstyle": "\uF737", - "sevenparen": "\u247A", - "sevenperiod": "\u248E", - "sevenpersian": "\u06F7", + "sevenmonospace": "\uff17", + "sevenoldstyle": "\uf737", + "sevenparen": "\u247a", + "sevenperiod": "\u248e", + "sevenpersian": "\u06f7", "sevenroman": "\u2176", "sevensuperior": "\u2077", "seventeencircle": "\u2470", "seventeenparen": "\u2484", "seventeenperiod": "\u2498", - "seventhai": "\u0E57", - "sfthyphen": "\u00AD", + "seventhai": "\u0e57", + "sfthyphen": "\u00ad", "shaarmenian": "\u0577", - "shabengali": "\u09B6", + "shabengali": "\u09b6", "shacyrillic": "\u0448", "shaddaarabic": "\u0651", - "shaddadammaarabic": "\uFC61", - "shaddadammatanarabic": "\uFC5E", - "shaddafathaarabic": "\uFC60", - "shaddafathatanarabic": "\u0651\u064B", - "shaddakasraarabic": "\uFC62", - "shaddakasratanarabic": "\uFC5F", + "shaddadammaarabic": "\ufc61", + "shaddadammatanarabic": "\ufc5e", + "shaddafathaarabic": "\ufc60", + "shaddafathatanarabic": "\u0651\u064b", + "shaddakasraarabic": "\ufc62", + "shaddakasratanarabic": "\ufc5f", "shade": "\u2592", "shadedark": "\u2593", "shadelight": "\u2591", "shademedium": "\u2592", "shadeva": "\u0936", - "shagujarati": "\u0AB6", - "shagurmukhi": "\u0A36", + "shagujarati": "\u0ab6", + "shagurmukhi": "\u0a36", "shalshelethebrew": "\u0593", "shbopomofo": "\u3115", "shchacyrillic": "\u0449", "sheenarabic": "\u0634", - "sheenfinalarabic": "\uFEB6", - "sheeninitialarabic": "\uFEB7", - "sheenmedialarabic": "\uFEB8", - "sheicoptic": "\u03E3", - "sheqel": "\u20AA", - "sheqelhebrew": "\u20AA", - "sheva": "\u05B0", - "sheva115": "\u05B0", - "sheva15": "\u05B0", - "sheva22": "\u05B0", - "sheva2e": "\u05B0", - "shevahebrew": "\u05B0", - "shevanarrowhebrew": "\u05B0", - "shevaquarterhebrew": "\u05B0", - "shevawidehebrew": "\u05B0", - "shhacyrillic": "\u04BB", - "shimacoptic": "\u03ED", - "shin": "\u05E9", - "shindagesh": "\uFB49", - "shindageshhebrew": "\uFB49", - "shindageshshindot": "\uFB2C", - "shindageshshindothebrew": "\uFB2C", - "shindageshsindot": "\uFB2D", - "shindageshsindothebrew": "\uFB2D", - "shindothebrew": "\u05C1", - "shinhebrew": "\u05E9", - "shinshindot": "\uFB2A", - "shinshindothebrew": "\uFB2A", - "shinsindot": "\uFB2B", - "shinsindothebrew": "\uFB2B", + "sheenfinalarabic": "\ufeb6", + "sheeninitialarabic": "\ufeb7", + "sheenmedialarabic": "\ufeb8", + "sheicoptic": "\u03e3", + "sheqel": "\u20aa", + "sheqelhebrew": "\u20aa", + "sheva": "\u05b0", + "sheva115": "\u05b0", + "sheva15": "\u05b0", + "sheva22": "\u05b0", + "sheva2e": "\u05b0", + "shevahebrew": "\u05b0", + "shevanarrowhebrew": "\u05b0", + "shevaquarterhebrew": "\u05b0", + "shevawidehebrew": "\u05b0", + "shhacyrillic": "\u04bb", + "shimacoptic": "\u03ed", + "shin": "\u05e9", + "shindagesh": "\ufb49", + "shindageshhebrew": "\ufb49", + "shindageshshindot": "\ufb2c", + "shindageshshindothebrew": "\ufb2c", + "shindageshsindot": "\ufb2d", + "shindageshsindothebrew": "\ufb2d", + "shindothebrew": "\u05c1", + "shinhebrew": "\u05e9", + "shinshindot": "\ufb2a", + "shinshindothebrew": "\ufb2a", + "shinsindot": "\ufb2b", + "shinsindothebrew": "\ufb2b", "shook": "\u0282", - "sigma": "\u03C3", - "sigma1": "\u03C2", - "sigmafinal": "\u03C2", - "sigmalunatesymbolgreek": "\u03F2", + "sigma": "\u03c3", + "sigma1": "\u03c2", + "sigmafinal": "\u03c2", + "sigmalunatesymbolgreek": "\u03f2", "sihiragana": "\u3057", - "sikatakana": "\u30B7", - "sikatakanahalfwidth": "\uFF7C", - "siluqhebrew": "\u05BD", - "siluqlefthebrew": "\u05BD", - "similar": "\u223C", - "sindothebrew": "\u05C2", + "sikatakana": "\u30b7", + "sikatakanahalfwidth": "\uff7c", + "siluqhebrew": "\u05bd", + "siluqlefthebrew": "\u05bd", + "similar": "\u223c", + "sindothebrew": "\u05c2", "siosacirclekorean": "\u3274", "siosaparenkorean": "\u3214", - "sioscieuckorean": "\u317E", + "sioscieuckorean": "\u317e", "sioscirclekorean": "\u3266", - "sioskiyeokkorean": "\u317A", + "sioskiyeokkorean": "\u317a", "sioskorean": "\u3145", - "siosnieunkorean": "\u317B", + "siosnieunkorean": "\u317b", "siosparenkorean": "\u3206", - "siospieupkorean": "\u317D", - "siostikeutkorean": "\u317C", + "siospieupkorean": "\u317d", + "siostikeutkorean": "\u317c", "six": "\u0036", "sixarabic": "\u0666", - "sixbengali": "\u09EC", + "sixbengali": "\u09ec", "sixcircle": "\u2465", - "sixcircleinversesansserif": "\u278F", - "sixdeva": "\u096C", - "sixgujarati": "\u0AEC", - "sixgurmukhi": "\u0A6C", + "sixcircleinversesansserif": "\u278f", + "sixdeva": "\u096c", + "sixgujarati": "\u0aec", + "sixgurmukhi": "\u0a6c", "sixhackarabic": "\u0666", "sixhangzhou": "\u3026", "sixideographicparen": "\u3225", "sixinferior": "\u2086", - "sixmonospace": "\uFF16", - "sixoldstyle": "\uF736", + "sixmonospace": "\uff16", + "sixoldstyle": "\uf736", "sixparen": "\u2479", - "sixperiod": "\u248D", - "sixpersian": "\u06F6", + "sixperiod": "\u248d", + "sixpersian": "\u06f6", "sixroman": "\u2175", "sixsuperior": "\u2076", - "sixteencircle": "\u246F", - "sixteencurrencydenominatorbengali": "\u09F9", + "sixteencircle": "\u246f", + "sixteencurrencydenominatorbengali": "\u09f9", "sixteenparen": "\u2483", "sixteenperiod": "\u2497", - "sixthai": "\u0E56", - "slash": "\u002F", - "slashmonospace": "\uFF0F", - "slong": "\u017F", - "slongdotaccent": "\u1E9B", - "smileface": "\u263A", - "smonospace": "\uFF53", - "sofpasuqhebrew": "\u05C3", - "softhyphen": "\u00AD", - "softsigncyrillic": "\u044C", - "sohiragana": "\u305D", - "sokatakana": "\u30BD", - "sokatakanahalfwidth": "\uFF7F", + "sixthai": "\u0e56", + "slash": "\u002f", + "slashmonospace": "\uff0f", + "slong": "\u017f", + "slongdotaccent": "\u1e9b", + "smileface": "\u263a", + "smonospace": "\uff53", + "sofpasuqhebrew": "\u05c3", + "softhyphen": "\u00ad", + "softsigncyrillic": "\u044c", + "sohiragana": "\u305d", + "sokatakana": "\u30bd", + "sokatakanahalfwidth": "\uff7f", "soliduslongoverlaycmb": "\u0338", "solidusshortoverlaycmb": "\u0337", - "sorusithai": "\u0E29", - "sosalathai": "\u0E28", - "sosothai": "\u0E0B", - "sosuathai": "\u0E2A", + "sorusithai": "\u0e29", + "sosalathai": "\u0e28", + "sosothai": "\u0e0b", + "sosuathai": "\u0e2a", "space": "\u0020", "spacehackarabic": "\u0020", "spade": "\u2660", "spadesuitblack": "\u2660", "spadesuitwhite": "\u2664", - "sparen": "\u24AE", - "squarebelowcmb": "\u033B", - "squarecc": "\u33C4", - "squarecm": "\u339D", - "squarediagonalcrosshatchfill": "\u25A9", - "squarehorizontalfill": "\u25A4", - "squarekg": "\u338F", - "squarekm": "\u339E", - "squarekmcapital": "\u33CE", - "squareln": "\u33D1", - "squarelog": "\u33D2", - "squaremg": "\u338E", - "squaremil": "\u33D5", - "squaremm": "\u339C", - "squaremsquared": "\u33A1", - "squareorthogonalcrosshatchfill": "\u25A6", - "squareupperlefttolowerrightfill": "\u25A7", - "squareupperrighttolowerleftfill": "\u25A8", - "squareverticalfill": "\u25A5", - "squarewhitewithsmallblack": "\u25A3", - "srsquare": "\u33DB", - "ssabengali": "\u09B7", + "sparen": "\u24ae", + "squarebelowcmb": "\u033b", + "squarecc": "\u33c4", + "squarecm": "\u339d", + "squarediagonalcrosshatchfill": "\u25a9", + "squarehorizontalfill": "\u25a4", + "squarekg": "\u338f", + "squarekm": "\u339e", + "squarekmcapital": "\u33ce", + "squareln": "\u33d1", + "squarelog": "\u33d2", + "squaremg": "\u338e", + "squaremil": "\u33d5", + "squaremm": "\u339c", + "squaremsquared": "\u33a1", + "squareorthogonalcrosshatchfill": "\u25a6", + "squareupperlefttolowerrightfill": "\u25a7", + "squareupperrighttolowerleftfill": "\u25a8", + "squareverticalfill": "\u25a5", + "squarewhitewithsmallblack": "\u25a3", + "srsquare": "\u33db", + "ssabengali": "\u09b7", "ssadeva": "\u0937", - "ssagujarati": "\u0AB7", + "ssagujarati": "\u0ab7", "ssangcieuckorean": "\u3149", "ssanghieuhkorean": "\u3185", "ssangieungkorean": "\u3180", @@ -3696,671 +3696,671 @@ def convert_glyphlist(path: str) -> None: "ssangpieupkorean": "\u3143", "ssangsioskorean": "\u3146", "ssangtikeutkorean": "\u3138", - "ssuperior": "\uF6F2", - "sterling": "\u00A3", - "sterlingmonospace": "\uFFE1", + "ssuperior": "\uf6f2", + "sterling": "\u00a3", + "sterlingmonospace": "\uffe1", "strokelongoverlaycmb": "\u0336", "strokeshortoverlaycmb": "\u0335", "subset": "\u2282", - "subsetnotequal": "\u228A", + "subsetnotequal": "\u228a", "subsetorequal": "\u2286", - "succeeds": "\u227B", - "suchthat": "\u220B", + "succeeds": "\u227b", + "suchthat": "\u220b", "suhiragana": "\u3059", - "sukatakana": "\u30B9", - "sukatakanahalfwidth": "\uFF7D", + "sukatakana": "\u30b9", + "sukatakanahalfwidth": "\uff7d", "sukunarabic": "\u0652", "summation": "\u2211", - "sun": "\u263C", + "sun": "\u263c", "superset": "\u2283", - "supersetnotequal": "\u228B", + "supersetnotequal": "\u228b", "supersetorequal": "\u2287", - "svsquare": "\u33DC", - "syouwaerasquare": "\u337C", + "svsquare": "\u33dc", + "syouwaerasquare": "\u337c", "t": "\u0074", - "tabengali": "\u09A4", - "tackdown": "\u22A4", - "tackleft": "\u22A3", + "tabengali": "\u09a4", + "tackdown": "\u22a4", + "tackleft": "\u22a3", "tadeva": "\u0924", - "tagujarati": "\u0AA4", - "tagurmukhi": "\u0A24", + "tagujarati": "\u0aa4", + "tagurmukhi": "\u0a24", "taharabic": "\u0637", - "tahfinalarabic": "\uFEC2", - "tahinitialarabic": "\uFEC3", - "tahiragana": "\u305F", - "tahmedialarabic": "\uFEC4", - "taisyouerasquare": "\u337D", - "takatakana": "\u30BF", - "takatakanahalfwidth": "\uFF80", + "tahfinalarabic": "\ufec2", + "tahinitialarabic": "\ufec3", + "tahiragana": "\u305f", + "tahmedialarabic": "\ufec4", + "taisyouerasquare": "\u337d", + "takatakana": "\u30bf", + "takatakanahalfwidth": "\uff80", "tatweelarabic": "\u0640", - "tau": "\u03C4", - "tav": "\u05EA", - "tavdages": "\uFB4A", - "tavdagesh": "\uFB4A", - "tavdageshhebrew": "\uFB4A", - "tavhebrew": "\u05EA", + "tau": "\u03c4", + "tav": "\u05ea", + "tavdages": "\ufb4a", + "tavdagesh": "\ufb4a", + "tavdageshhebrew": "\ufb4a", + "tavhebrew": "\u05ea", "tbar": "\u0167", - "tbopomofo": "\u310A", + "tbopomofo": "\u310a", "tcaron": "\u0165", - "tccurl": "\u02A8", + "tccurl": "\u02a8", "tcedilla": "\u0163", "tcheharabic": "\u0686", - "tchehfinalarabic": "\uFB7B", - "tchehinitialarabic": "\uFB7C", - "tchehmedialarabic": "\uFB7D", - "tchehmeeminitialarabic": "\uFB7C\uFEE4", - "tcircle": "\u24E3", - "tcircumflexbelow": "\u1E71", + "tchehfinalarabic": "\ufb7b", + "tchehinitialarabic": "\ufb7c", + "tchehmedialarabic": "\ufb7d", + "tchehmeeminitialarabic": "\ufb7c\ufee4", + "tcircle": "\u24e3", + "tcircumflexbelow": "\u1e71", "tcommaaccent": "\u0163", - "tdieresis": "\u1E97", - "tdotaccent": "\u1E6B", - "tdotbelow": "\u1E6D", + "tdieresis": "\u1e97", + "tdotaccent": "\u1e6b", + "tdotbelow": "\u1e6d", "tecyrillic": "\u0442", - "tedescendercyrillic": "\u04AD", - "teharabic": "\u062A", - "tehfinalarabic": "\uFE96", - "tehhahinitialarabic": "\uFCA2", - "tehhahisolatedarabic": "\uFC0C", - "tehinitialarabic": "\uFE97", + "tedescendercyrillic": "\u04ad", + "teharabic": "\u062a", + "tehfinalarabic": "\ufe96", + "tehhahinitialarabic": "\ufca2", + "tehhahisolatedarabic": "\ufc0c", + "tehinitialarabic": "\ufe97", "tehiragana": "\u3066", - "tehjeeminitialarabic": "\uFCA1", - "tehjeemisolatedarabic": "\uFC0B", + "tehjeeminitialarabic": "\ufca1", + "tehjeemisolatedarabic": "\ufc0b", "tehmarbutaarabic": "\u0629", - "tehmarbutafinalarabic": "\uFE94", - "tehmedialarabic": "\uFE98", - "tehmeeminitialarabic": "\uFCA4", - "tehmeemisolatedarabic": "\uFC0E", - "tehnoonfinalarabic": "\uFC73", - "tekatakana": "\u30C6", - "tekatakanahalfwidth": "\uFF83", + "tehmarbutafinalarabic": "\ufe94", + "tehmedialarabic": "\ufe98", + "tehmeeminitialarabic": "\ufca4", + "tehmeemisolatedarabic": "\ufc0e", + "tehnoonfinalarabic": "\ufc73", + "tekatakana": "\u30c6", + "tekatakanahalfwidth": "\uff83", "telephone": "\u2121", - "telephoneblack": "\u260E", - "telishagedolahebrew": "\u05A0", - "telishaqetanahebrew": "\u05A9", + "telephoneblack": "\u260e", + "telishagedolahebrew": "\u05a0", + "telishaqetanahebrew": "\u05a9", "tencircle": "\u2469", "tenideographicparen": "\u3229", - "tenparen": "\u247D", + "tenparen": "\u247d", "tenperiod": "\u2491", "tenroman": "\u2179", - "tesh": "\u02A7", - "tet": "\u05D8", - "tetdagesh": "\uFB38", - "tetdageshhebrew": "\uFB38", - "tethebrew": "\u05D8", - "tetsecyrillic": "\u04B5", - "tevirhebrew": "\u059B", - "tevirlefthebrew": "\u059B", - "thabengali": "\u09A5", + "tesh": "\u02a7", + "tet": "\u05d8", + "tetdagesh": "\ufb38", + "tetdageshhebrew": "\ufb38", + "tethebrew": "\u05d8", + "tetsecyrillic": "\u04b5", + "tevirhebrew": "\u059b", + "tevirlefthebrew": "\u059b", + "thabengali": "\u09a5", "thadeva": "\u0925", - "thagujarati": "\u0AA5", - "thagurmukhi": "\u0A25", + "thagujarati": "\u0aa5", + "thagurmukhi": "\u0a25", "thalarabic": "\u0630", - "thalfinalarabic": "\uFEAC", - "thanthakhatlowleftthai": "\uF898", - "thanthakhatlowrightthai": "\uF897", - "thanthakhatthai": "\u0E4C", - "thanthakhatupperleftthai": "\uF896", - "theharabic": "\u062B", - "thehfinalarabic": "\uFE9A", - "thehinitialarabic": "\uFE9B", - "thehmedialarabic": "\uFE9C", + "thalfinalarabic": "\ufeac", + "thanthakhatlowleftthai": "\uf898", + "thanthakhatlowrightthai": "\uf897", + "thanthakhatthai": "\u0e4c", + "thanthakhatupperleftthai": "\uf896", + "theharabic": "\u062b", + "thehfinalarabic": "\ufe9a", + "thehinitialarabic": "\ufe9b", + "thehmedialarabic": "\ufe9c", "thereexists": "\u2203", "therefore": "\u2234", - "theta": "\u03B8", - "theta1": "\u03D1", - "thetasymbolgreek": "\u03D1", + "theta": "\u03b8", + "theta1": "\u03d1", + "thetasymbolgreek": "\u03d1", "thieuthacirclekorean": "\u3279", "thieuthaparenkorean": "\u3219", - "thieuthcirclekorean": "\u326B", - "thieuthkorean": "\u314C", - "thieuthparenkorean": "\u320B", - "thirteencircle": "\u246C", + "thieuthcirclekorean": "\u326b", + "thieuthkorean": "\u314c", + "thieuthparenkorean": "\u320b", + "thirteencircle": "\u246c", "thirteenparen": "\u2480", "thirteenperiod": "\u2494", - "thonangmonthothai": "\u0E11", - "thook": "\u01AD", - "thophuthaothai": "\u0E12", - "thorn": "\u00FE", - "thothahanthai": "\u0E17", - "thothanthai": "\u0E10", - "thothongthai": "\u0E18", - "thothungthai": "\u0E16", + "thonangmonthothai": "\u0e11", + "thook": "\u01ad", + "thophuthaothai": "\u0e12", + "thorn": "\u00fe", + "thothahanthai": "\u0e17", + "thothanthai": "\u0e10", + "thothongthai": "\u0e18", + "thothungthai": "\u0e16", "thousandcyrillic": "\u0482", - "thousandsseparatorarabic": "\u066C", - "thousandsseparatorpersian": "\u066C", + "thousandsseparatorarabic": "\u066c", + "thousandsseparatorpersian": "\u066c", "three": "\u0033", "threearabic": "\u0663", - "threebengali": "\u09E9", + "threebengali": "\u09e9", "threecircle": "\u2462", - "threecircleinversesansserif": "\u278C", + "threecircleinversesansserif": "\u278c", "threedeva": "\u0969", - "threeeighths": "\u215C", - "threegujarati": "\u0AE9", - "threegurmukhi": "\u0A69", + "threeeighths": "\u215c", + "threegujarati": "\u0ae9", + "threegurmukhi": "\u0a69", "threehackarabic": "\u0663", "threehangzhou": "\u3023", "threeideographicparen": "\u3222", "threeinferior": "\u2083", - "threemonospace": "\uFF13", - "threenumeratorbengali": "\u09F6", - "threeoldstyle": "\uF733", + "threemonospace": "\uff13", + "threenumeratorbengali": "\u09f6", + "threeoldstyle": "\uf733", "threeparen": "\u2476", - "threeperiod": "\u248A", - "threepersian": "\u06F3", - "threequarters": "\u00BE", - "threequartersemdash": "\uF6DE", + "threeperiod": "\u248a", + "threepersian": "\u06f3", + "threequarters": "\u00be", + "threequartersemdash": "\uf6de", "threeroman": "\u2172", - "threesuperior": "\u00B3", - "threethai": "\u0E53", + "threesuperior": "\u00b3", + "threethai": "\u0e53", "thzsquare": "\u3394", "tihiragana": "\u3061", - "tikatakana": "\u30C1", - "tikatakanahalfwidth": "\uFF81", + "tikatakana": "\u30c1", + "tikatakanahalfwidth": "\uff81", "tikeutacirclekorean": "\u3270", "tikeutaparenkorean": "\u3210", "tikeutcirclekorean": "\u3262", "tikeutkorean": "\u3137", "tikeutparenkorean": "\u3202", - "tilde": "\u02DC", + "tilde": "\u02dc", "tildebelowcmb": "\u0330", "tildecmb": "\u0303", "tildecomb": "\u0303", "tildedoublecmb": "\u0360", - "tildeoperator": "\u223C", + "tildeoperator": "\u223c", "tildeoverlaycmb": "\u0334", - "tildeverticalcmb": "\u033E", + "tildeverticalcmb": "\u033e", "timescircle": "\u2297", "tipehahebrew": "\u0596", "tipehalefthebrew": "\u0596", - "tippigurmukhi": "\u0A70", + "tippigurmukhi": "\u0a70", "titlocyrilliccmb": "\u0483", - "tiwnarmenian": "\u057F", - "tlinebelow": "\u1E6F", - "tmonospace": "\uFF54", + "tiwnarmenian": "\u057f", + "tlinebelow": "\u1e6f", + "tmonospace": "\uff54", "toarmenian": "\u0569", "tohiragana": "\u3068", - "tokatakana": "\u30C8", - "tokatakanahalfwidth": "\uFF84", - "tonebarextrahighmod": "\u02E5", - "tonebarextralowmod": "\u02E9", - "tonebarhighmod": "\u02E6", - "tonebarlowmod": "\u02E8", - "tonebarmidmod": "\u02E7", - "tonefive": "\u01BD", + "tokatakana": "\u30c8", + "tokatakanahalfwidth": "\uff84", + "tonebarextrahighmod": "\u02e5", + "tonebarextralowmod": "\u02e9", + "tonebarhighmod": "\u02e6", + "tonebarlowmod": "\u02e8", + "tonebarmidmod": "\u02e7", + "tonefive": "\u01bd", "tonesix": "\u0185", - "tonetwo": "\u01A8", + "tonetwo": "\u01a8", "tonos": "\u0384", "tonsquare": "\u3327", - "topatakthai": "\u0E0F", + "topatakthai": "\u0e0f", "tortoiseshellbracketleft": "\u3014", - "tortoiseshellbracketleftsmall": "\uFE5D", - "tortoiseshellbracketleftvertical": "\uFE39", + "tortoiseshellbracketleftsmall": "\ufe5d", + "tortoiseshellbracketleftvertical": "\ufe39", "tortoiseshellbracketright": "\u3015", - "tortoiseshellbracketrightsmall": "\uFE5E", - "tortoiseshellbracketrightvertical": "\uFE3A", - "totaothai": "\u0E15", - "tpalatalhook": "\u01AB", - "tparen": "\u24AF", + "tortoiseshellbracketrightsmall": "\ufe5e", + "tortoiseshellbracketrightvertical": "\ufe3a", + "totaothai": "\u0e15", + "tpalatalhook": "\u01ab", + "tparen": "\u24af", "trademark": "\u2122", - "trademarksans": "\uF8EA", - "trademarkserif": "\uF6DB", + "trademarksans": "\uf8ea", + "trademarkserif": "\uf6db", "tretroflexhook": "\u0288", - "triagdn": "\u25BC", - "triaglf": "\u25C4", - "triagrt": "\u25BA", - "triagup": "\u25B2", - "ts": "\u02A6", - "tsadi": "\u05E6", - "tsadidagesh": "\uFB46", - "tsadidageshhebrew": "\uFB46", - "tsadihebrew": "\u05E6", + "triagdn": "\u25bc", + "triaglf": "\u25c4", + "triagrt": "\u25ba", + "triagup": "\u25b2", + "ts": "\u02a6", + "tsadi": "\u05e6", + "tsadidagesh": "\ufb46", + "tsadidageshhebrew": "\ufb46", + "tsadihebrew": "\u05e6", "tsecyrillic": "\u0446", - "tsere": "\u05B5", - "tsere12": "\u05B5", - "tsere1e": "\u05B5", - "tsere2b": "\u05B5", - "tserehebrew": "\u05B5", - "tserenarrowhebrew": "\u05B5", - "tserequarterhebrew": "\u05B5", - "tserewidehebrew": "\u05B5", - "tshecyrillic": "\u045B", - "tsuperior": "\uF6F3", - "ttabengali": "\u099F", - "ttadeva": "\u091F", - "ttagujarati": "\u0A9F", - "ttagurmukhi": "\u0A1F", + "tsere": "\u05b5", + "tsere12": "\u05b5", + "tsere1e": "\u05b5", + "tsere2b": "\u05b5", + "tserehebrew": "\u05b5", + "tserenarrowhebrew": "\u05b5", + "tserequarterhebrew": "\u05b5", + "tserewidehebrew": "\u05b5", + "tshecyrillic": "\u045b", + "tsuperior": "\uf6f3", + "ttabengali": "\u099f", + "ttadeva": "\u091f", + "ttagujarati": "\u0a9f", + "ttagurmukhi": "\u0a1f", "tteharabic": "\u0679", - "ttehfinalarabic": "\uFB67", - "ttehinitialarabic": "\uFB68", - "ttehmedialarabic": "\uFB69", - "tthabengali": "\u09A0", + "ttehfinalarabic": "\ufb67", + "ttehinitialarabic": "\ufb68", + "ttehmedialarabic": "\ufb69", + "tthabengali": "\u09a0", "tthadeva": "\u0920", - "tthagujarati": "\u0AA0", - "tthagurmukhi": "\u0A20", + "tthagujarati": "\u0aa0", + "tthagurmukhi": "\u0a20", "tturned": "\u0287", "tuhiragana": "\u3064", - "tukatakana": "\u30C4", - "tukatakanahalfwidth": "\uFF82", + "tukatakana": "\u30c4", + "tukatakanahalfwidth": "\uff82", "tusmallhiragana": "\u3063", - "tusmallkatakana": "\u30C3", - "tusmallkatakanahalfwidth": "\uFF6F", - "twelvecircle": "\u246B", - "twelveparen": "\u247F", + "tusmallkatakana": "\u30c3", + "tusmallkatakanahalfwidth": "\uff6f", + "twelvecircle": "\u246b", + "twelveparen": "\u247f", "twelveperiod": "\u2493", - "twelveroman": "\u217B", + "twelveroman": "\u217b", "twentycircle": "\u2473", "twentyhangzhou": "\u5344", "twentyparen": "\u2487", - "twentyperiod": "\u249B", + "twentyperiod": "\u249b", "two": "\u0032", "twoarabic": "\u0662", - "twobengali": "\u09E8", + "twobengali": "\u09e8", "twocircle": "\u2461", - "twocircleinversesansserif": "\u278B", + "twocircleinversesansserif": "\u278b", "twodeva": "\u0968", "twodotenleader": "\u2025", "twodotleader": "\u2025", - "twodotleadervertical": "\uFE30", - "twogujarati": "\u0AE8", - "twogurmukhi": "\u0A68", + "twodotleadervertical": "\ufe30", + "twogujarati": "\u0ae8", + "twogurmukhi": "\u0a68", "twohackarabic": "\u0662", "twohangzhou": "\u3022", "twoideographicparen": "\u3221", "twoinferior": "\u2082", - "twomonospace": "\uFF12", - "twonumeratorbengali": "\u09F5", - "twooldstyle": "\uF732", + "twomonospace": "\uff12", + "twonumeratorbengali": "\u09f5", + "twooldstyle": "\uf732", "twoparen": "\u2475", "twoperiod": "\u2489", - "twopersian": "\u06F2", + "twopersian": "\u06f2", "tworoman": "\u2171", - "twostroke": "\u01BB", - "twosuperior": "\u00B2", - "twothai": "\u0E52", + "twostroke": "\u01bb", + "twosuperior": "\u00b2", + "twothai": "\u0e52", "twothirds": "\u2154", "u": "\u0075", - "uacute": "\u00FA", + "uacute": "\u00fa", "ubar": "\u0289", "ubengali": "\u0989", "ubopomofo": "\u3128", - "ubreve": "\u016D", - "ucaron": "\u01D4", - "ucircle": "\u24E4", - "ucircumflex": "\u00FB", - "ucircumflexbelow": "\u1E77", + "ubreve": "\u016d", + "ucaron": "\u01d4", + "ucircle": "\u24e4", + "ucircumflex": "\u00fb", + "ucircumflexbelow": "\u1e77", "ucyrillic": "\u0443", "udattadeva": "\u0951", "udblacute": "\u0171", "udblgrave": "\u0215", "udeva": "\u0909", - "udieresis": "\u00FC", - "udieresisacute": "\u01D8", - "udieresisbelow": "\u1E73", - "udieresiscaron": "\u01DA", - "udieresiscyrillic": "\u04F1", - "udieresisgrave": "\u01DC", - "udieresismacron": "\u01D6", - "udotbelow": "\u1EE5", - "ugrave": "\u00F9", - "ugujarati": "\u0A89", - "ugurmukhi": "\u0A09", + "udieresis": "\u00fc", + "udieresisacute": "\u01d8", + "udieresisbelow": "\u1e73", + "udieresiscaron": "\u01da", + "udieresiscyrillic": "\u04f1", + "udieresisgrave": "\u01dc", + "udieresismacron": "\u01d6", + "udotbelow": "\u1ee5", + "ugrave": "\u00f9", + "ugujarati": "\u0a89", + "ugurmukhi": "\u0a09", "uhiragana": "\u3046", - "uhookabove": "\u1EE7", - "uhorn": "\u01B0", - "uhornacute": "\u1EE9", - "uhorndotbelow": "\u1EF1", - "uhorngrave": "\u1EEB", - "uhornhookabove": "\u1EED", - "uhorntilde": "\u1EEF", + "uhookabove": "\u1ee7", + "uhorn": "\u01b0", + "uhornacute": "\u1ee9", + "uhorndotbelow": "\u1ef1", + "uhorngrave": "\u1eeb", + "uhornhookabove": "\u1eed", + "uhorntilde": "\u1eef", "uhungarumlaut": "\u0171", - "uhungarumlautcyrillic": "\u04F3", + "uhungarumlautcyrillic": "\u04f3", "uinvertedbreve": "\u0217", - "ukatakana": "\u30A6", - "ukatakanahalfwidth": "\uFF73", + "ukatakana": "\u30a6", + "ukatakanahalfwidth": "\uff73", "ukcyrillic": "\u0479", - "ukorean": "\u315C", - "umacron": "\u016B", - "umacroncyrillic": "\u04EF", - "umacrondieresis": "\u1E7B", - "umatragurmukhi": "\u0A41", - "umonospace": "\uFF55", - "underscore": "\u005F", + "ukorean": "\u315c", + "umacron": "\u016b", + "umacroncyrillic": "\u04ef", + "umacrondieresis": "\u1e7b", + "umatragurmukhi": "\u0a41", + "umonospace": "\uff55", + "underscore": "\u005f", "underscoredbl": "\u2017", - "underscoremonospace": "\uFF3F", - "underscorevertical": "\uFE33", - "underscorewavy": "\uFE4F", - "union": "\u222A", + "underscoremonospace": "\uff3f", + "underscorevertical": "\ufe33", + "underscorewavy": "\ufe4f", + "union": "\u222a", "universal": "\u2200", "uogonek": "\u0173", - "uparen": "\u24B0", + "uparen": "\u24b0", "upblock": "\u2580", - "upperdothebrew": "\u05C4", - "upsilon": "\u03C5", - "upsilondieresis": "\u03CB", - "upsilondieresistonos": "\u03B0", - "upsilonlatin": "\u028A", - "upsilontonos": "\u03CD", - "uptackbelowcmb": "\u031D", - "uptackmod": "\u02D4", - "uragurmukhi": "\u0A73", - "uring": "\u016F", - "ushortcyrillic": "\u045E", + "upperdothebrew": "\u05c4", + "upsilon": "\u03c5", + "upsilondieresis": "\u03cb", + "upsilondieresistonos": "\u03b0", + "upsilonlatin": "\u028a", + "upsilontonos": "\u03cd", + "uptackbelowcmb": "\u031d", + "uptackmod": "\u02d4", + "uragurmukhi": "\u0a73", + "uring": "\u016f", + "ushortcyrillic": "\u045e", "usmallhiragana": "\u3045", - "usmallkatakana": "\u30A5", - "usmallkatakanahalfwidth": "\uFF69", - "ustraightcyrillic": "\u04AF", - "ustraightstrokecyrillic": "\u04B1", + "usmallkatakana": "\u30a5", + "usmallkatakanahalfwidth": "\uff69", + "ustraightcyrillic": "\u04af", + "ustraightstrokecyrillic": "\u04b1", "utilde": "\u0169", - "utildeacute": "\u1E79", - "utildebelow": "\u1E75", - "uubengali": "\u098A", - "uudeva": "\u090A", - "uugujarati": "\u0A8A", - "uugurmukhi": "\u0A0A", - "uumatragurmukhi": "\u0A42", - "uuvowelsignbengali": "\u09C2", + "utildeacute": "\u1e79", + "utildebelow": "\u1e75", + "uubengali": "\u098a", + "uudeva": "\u090a", + "uugujarati": "\u0a8a", + "uugurmukhi": "\u0a0a", + "uumatragurmukhi": "\u0a42", + "uuvowelsignbengali": "\u09c2", "uuvowelsigndeva": "\u0942", - "uuvowelsigngujarati": "\u0AC2", - "uvowelsignbengali": "\u09C1", + "uuvowelsigngujarati": "\u0ac2", + "uvowelsignbengali": "\u09c1", "uvowelsigndeva": "\u0941", - "uvowelsigngujarati": "\u0AC1", + "uvowelsigngujarati": "\u0ac1", "v": "\u0076", "vadeva": "\u0935", - "vagujarati": "\u0AB5", - "vagurmukhi": "\u0A35", - "vakatakana": "\u30F7", - "vav": "\u05D5", - "vavdagesh": "\uFB35", - "vavdagesh65": "\uFB35", - "vavdageshhebrew": "\uFB35", - "vavhebrew": "\u05D5", - "vavholam": "\uFB4B", - "vavholamhebrew": "\uFB4B", - "vavvavhebrew": "\u05F0", - "vavyodhebrew": "\u05F1", - "vcircle": "\u24E5", - "vdotbelow": "\u1E7F", + "vagujarati": "\u0ab5", + "vagurmukhi": "\u0a35", + "vakatakana": "\u30f7", + "vav": "\u05d5", + "vavdagesh": "\ufb35", + "vavdagesh65": "\ufb35", + "vavdageshhebrew": "\ufb35", + "vavhebrew": "\u05d5", + "vavholam": "\ufb4b", + "vavholamhebrew": "\ufb4b", + "vavvavhebrew": "\u05f0", + "vavyodhebrew": "\u05f1", + "vcircle": "\u24e5", + "vdotbelow": "\u1e7f", "vecyrillic": "\u0432", - "veharabic": "\u06A4", - "vehfinalarabic": "\uFB6B", - "vehinitialarabic": "\uFB6C", - "vehmedialarabic": "\uFB6D", - "vekatakana": "\u30F9", + "veharabic": "\u06a4", + "vehfinalarabic": "\ufb6b", + "vehinitialarabic": "\ufb6c", + "vehmedialarabic": "\ufb6d", + "vekatakana": "\u30f9", "venus": "\u2640", - "verticalbar": "\u007C", - "verticallineabovecmb": "\u030D", + "verticalbar": "\u007c", + "verticallineabovecmb": "\u030d", "verticallinebelowcmb": "\u0329", - "verticallinelowmod": "\u02CC", - "verticallinemod": "\u02C8", - "vewarmenian": "\u057E", - "vhook": "\u028B", - "vikatakana": "\u30F8", - "viramabengali": "\u09CD", - "viramadeva": "\u094D", - "viramagujarati": "\u0ACD", + "verticallinelowmod": "\u02cc", + "verticallinemod": "\u02c8", + "vewarmenian": "\u057e", + "vhook": "\u028b", + "vikatakana": "\u30f8", + "viramabengali": "\u09cd", + "viramadeva": "\u094d", + "viramagujarati": "\u0acd", "visargabengali": "\u0983", "visargadeva": "\u0903", - "visargagujarati": "\u0A83", - "vmonospace": "\uFF56", + "visargagujarati": "\u0a83", + "vmonospace": "\uff56", "voarmenian": "\u0578", - "voicediterationhiragana": "\u309E", - "voicediterationkatakana": "\u30FE", - "voicedmarkkana": "\u309B", - "voicedmarkkanahalfwidth": "\uFF9E", - "vokatakana": "\u30FA", - "vparen": "\u24B1", - "vtilde": "\u1E7D", - "vturned": "\u028C", + "voicediterationhiragana": "\u309e", + "voicediterationkatakana": "\u30fe", + "voicedmarkkana": "\u309b", + "voicedmarkkanahalfwidth": "\uff9e", + "vokatakana": "\u30fa", + "vparen": "\u24b1", + "vtilde": "\u1e7d", + "vturned": "\u028c", "vuhiragana": "\u3094", - "vukatakana": "\u30F4", + "vukatakana": "\u30f4", "w": "\u0077", - "wacute": "\u1E83", + "wacute": "\u1e83", "waekorean": "\u3159", - "wahiragana": "\u308F", - "wakatakana": "\u30EF", - "wakatakanahalfwidth": "\uFF9C", + "wahiragana": "\u308f", + "wakatakana": "\u30ef", + "wakatakanahalfwidth": "\uff9c", "wakorean": "\u3158", - "wasmallhiragana": "\u308E", - "wasmallkatakana": "\u30EE", + "wasmallhiragana": "\u308e", + "wasmallkatakana": "\u30ee", "wattosquare": "\u3357", - "wavedash": "\u301C", - "wavyunderscorevertical": "\uFE34", + "wavedash": "\u301c", + "wavyunderscorevertical": "\ufe34", "wawarabic": "\u0648", - "wawfinalarabic": "\uFEEE", + "wawfinalarabic": "\ufeee", "wawhamzaabovearabic": "\u0624", - "wawhamzaabovefinalarabic": "\uFE86", - "wbsquare": "\u33DD", - "wcircle": "\u24E6", + "wawhamzaabovefinalarabic": "\ufe86", + "wbsquare": "\u33dd", + "wcircle": "\u24e6", "wcircumflex": "\u0175", - "wdieresis": "\u1E85", - "wdotaccent": "\u1E87", - "wdotbelow": "\u1E89", + "wdieresis": "\u1e85", + "wdotaccent": "\u1e87", + "wdotbelow": "\u1e89", "wehiragana": "\u3091", "weierstrass": "\u2118", - "wekatakana": "\u30F1", - "wekorean": "\u315E", - "weokorean": "\u315D", - "wgrave": "\u1E81", - "whitebullet": "\u25E6", - "whitecircle": "\u25CB", - "whitecircleinverse": "\u25D9", - "whitecornerbracketleft": "\u300E", - "whitecornerbracketleftvertical": "\uFE43", - "whitecornerbracketright": "\u300F", - "whitecornerbracketrightvertical": "\uFE44", - "whitediamond": "\u25C7", - "whitediamondcontainingblacksmalldiamond": "\u25C8", - "whitedownpointingsmalltriangle": "\u25BF", - "whitedownpointingtriangle": "\u25BD", - "whiteleftpointingsmalltriangle": "\u25C3", - "whiteleftpointingtriangle": "\u25C1", + "wekatakana": "\u30f1", + "wekorean": "\u315e", + "weokorean": "\u315d", + "wgrave": "\u1e81", + "whitebullet": "\u25e6", + "whitecircle": "\u25cb", + "whitecircleinverse": "\u25d9", + "whitecornerbracketleft": "\u300e", + "whitecornerbracketleftvertical": "\ufe43", + "whitecornerbracketright": "\u300f", + "whitecornerbracketrightvertical": "\ufe44", + "whitediamond": "\u25c7", + "whitediamondcontainingblacksmalldiamond": "\u25c8", + "whitedownpointingsmalltriangle": "\u25bf", + "whitedownpointingtriangle": "\u25bd", + "whiteleftpointingsmalltriangle": "\u25c3", + "whiteleftpointingtriangle": "\u25c1", "whitelenticularbracketleft": "\u3016", "whitelenticularbracketright": "\u3017", - "whiterightpointingsmalltriangle": "\u25B9", - "whiterightpointingtriangle": "\u25B7", - "whitesmallsquare": "\u25AB", - "whitesmilingface": "\u263A", - "whitesquare": "\u25A1", + "whiterightpointingsmalltriangle": "\u25b9", + "whiterightpointingtriangle": "\u25b7", + "whitesmallsquare": "\u25ab", + "whitesmilingface": "\u263a", + "whitesquare": "\u25a1", "whitestar": "\u2606", - "whitetelephone": "\u260F", + "whitetelephone": "\u260f", "whitetortoiseshellbracketleft": "\u3018", "whitetortoiseshellbracketright": "\u3019", - "whiteuppointingsmalltriangle": "\u25B5", - "whiteuppointingtriangle": "\u25B3", + "whiteuppointingsmalltriangle": "\u25b5", + "whiteuppointingtriangle": "\u25b3", "wihiragana": "\u3090", - "wikatakana": "\u30F0", - "wikorean": "\u315F", - "wmonospace": "\uFF57", + "wikatakana": "\u30f0", + "wikorean": "\u315f", + "wmonospace": "\uff57", "wohiragana": "\u3092", - "wokatakana": "\u30F2", - "wokatakanahalfwidth": "\uFF66", - "won": "\u20A9", - "wonmonospace": "\uFFE6", - "wowaenthai": "\u0E27", - "wparen": "\u24B2", - "wring": "\u1E98", - "wsuperior": "\u02B7", - "wturned": "\u028D", - "wynn": "\u01BF", + "wokatakana": "\u30f2", + "wokatakanahalfwidth": "\uff66", + "won": "\u20a9", + "wonmonospace": "\uffe6", + "wowaenthai": "\u0e27", + "wparen": "\u24b2", + "wring": "\u1e98", + "wsuperior": "\u02b7", + "wturned": "\u028d", + "wynn": "\u01bf", "x": "\u0078", - "xabovecmb": "\u033D", + "xabovecmb": "\u033d", "xbopomofo": "\u3112", - "xcircle": "\u24E7", - "xdieresis": "\u1E8D", - "xdotaccent": "\u1E8B", - "xeharmenian": "\u056D", - "xi": "\u03BE", - "xmonospace": "\uFF58", - "xparen": "\u24B3", - "xsuperior": "\u02E3", + "xcircle": "\u24e7", + "xdieresis": "\u1e8d", + "xdotaccent": "\u1e8b", + "xeharmenian": "\u056d", + "xi": "\u03be", + "xmonospace": "\uff58", + "xparen": "\u24b3", + "xsuperior": "\u02e3", "y": "\u0079", - "yaadosquare": "\u334E", - "yabengali": "\u09AF", - "yacute": "\u00FD", - "yadeva": "\u092F", + "yaadosquare": "\u334e", + "yabengali": "\u09af", + "yacute": "\u00fd", + "yadeva": "\u092f", "yaekorean": "\u3152", - "yagujarati": "\u0AAF", - "yagurmukhi": "\u0A2F", + "yagujarati": "\u0aaf", + "yagurmukhi": "\u0a2f", "yahiragana": "\u3084", - "yakatakana": "\u30E4", - "yakatakanahalfwidth": "\uFF94", + "yakatakana": "\u30e4", + "yakatakanahalfwidth": "\uff94", "yakorean": "\u3151", - "yamakkanthai": "\u0E4E", + "yamakkanthai": "\u0e4e", "yasmallhiragana": "\u3083", - "yasmallkatakana": "\u30E3", - "yasmallkatakanahalfwidth": "\uFF6C", + "yasmallkatakana": "\u30e3", + "yasmallkatakanahalfwidth": "\uff6c", "yatcyrillic": "\u0463", - "ycircle": "\u24E8", + "ycircle": "\u24e8", "ycircumflex": "\u0177", - "ydieresis": "\u00FF", - "ydotaccent": "\u1E8F", - "ydotbelow": "\u1EF5", - "yeharabic": "\u064A", - "yehbarreearabic": "\u06D2", - "yehbarreefinalarabic": "\uFBAF", - "yehfinalarabic": "\uFEF2", + "ydieresis": "\u00ff", + "ydotaccent": "\u1e8f", + "ydotbelow": "\u1ef5", + "yeharabic": "\u064a", + "yehbarreearabic": "\u06d2", + "yehbarreefinalarabic": "\ufbaf", + "yehfinalarabic": "\ufef2", "yehhamzaabovearabic": "\u0626", - "yehhamzaabovefinalarabic": "\uFE8A", - "yehhamzaaboveinitialarabic": "\uFE8B", - "yehhamzaabovemedialarabic": "\uFE8C", - "yehinitialarabic": "\uFEF3", - "yehmedialarabic": "\uFEF4", - "yehmeeminitialarabic": "\uFCDD", - "yehmeemisolatedarabic": "\uFC58", - "yehnoonfinalarabic": "\uFC94", - "yehthreedotsbelowarabic": "\u06D1", + "yehhamzaabovefinalarabic": "\ufe8a", + "yehhamzaaboveinitialarabic": "\ufe8b", + "yehhamzaabovemedialarabic": "\ufe8c", + "yehinitialarabic": "\ufef3", + "yehmedialarabic": "\ufef4", + "yehmeeminitialarabic": "\ufcdd", + "yehmeemisolatedarabic": "\ufc58", + "yehnoonfinalarabic": "\ufc94", + "yehthreedotsbelowarabic": "\u06d1", "yekorean": "\u3156", - "yen": "\u00A5", - "yenmonospace": "\uFFE5", + "yen": "\u00a5", + "yenmonospace": "\uffe5", "yeokorean": "\u3155", "yeorinhieuhkorean": "\u3186", - "yerahbenyomohebrew": "\u05AA", - "yerahbenyomolefthebrew": "\u05AA", - "yericyrillic": "\u044B", - "yerudieresiscyrillic": "\u04F9", + "yerahbenyomohebrew": "\u05aa", + "yerahbenyomolefthebrew": "\u05aa", + "yericyrillic": "\u044b", + "yerudieresiscyrillic": "\u04f9", "yesieungkorean": "\u3181", "yesieungpansioskorean": "\u3183", "yesieungsioskorean": "\u3182", - "yetivhebrew": "\u059A", - "ygrave": "\u1EF3", - "yhook": "\u01B4", - "yhookabove": "\u1EF7", + "yetivhebrew": "\u059a", + "ygrave": "\u1ef3", + "yhook": "\u01b4", + "yhookabove": "\u1ef7", "yiarmenian": "\u0575", "yicyrillic": "\u0457", "yikorean": "\u3162", - "yinyang": "\u262F", + "yinyang": "\u262f", "yiwnarmenian": "\u0582", - "ymonospace": "\uFF59", - "yod": "\u05D9", - "yoddagesh": "\uFB39", - "yoddageshhebrew": "\uFB39", - "yodhebrew": "\u05D9", - "yodyodhebrew": "\u05F2", - "yodyodpatahhebrew": "\uFB1F", + "ymonospace": "\uff59", + "yod": "\u05d9", + "yoddagesh": "\ufb39", + "yoddageshhebrew": "\ufb39", + "yodhebrew": "\u05d9", + "yodyodhebrew": "\u05f2", + "yodyodpatahhebrew": "\ufb1f", "yohiragana": "\u3088", "yoikorean": "\u3189", - "yokatakana": "\u30E8", - "yokatakanahalfwidth": "\uFF96", - "yokorean": "\u315B", + "yokatakana": "\u30e8", + "yokatakanahalfwidth": "\uff96", + "yokorean": "\u315b", "yosmallhiragana": "\u3087", - "yosmallkatakana": "\u30E7", - "yosmallkatakanahalfwidth": "\uFF6E", - "yotgreek": "\u03F3", + "yosmallkatakana": "\u30e7", + "yosmallkatakanahalfwidth": "\uff6e", + "yotgreek": "\u03f3", "yoyaekorean": "\u3188", "yoyakorean": "\u3187", - "yoyakthai": "\u0E22", - "yoyingthai": "\u0E0D", - "yparen": "\u24B4", - "ypogegrammeni": "\u037A", + "yoyakthai": "\u0e22", + "yoyingthai": "\u0e0d", + "yparen": "\u24b4", + "ypogegrammeni": "\u037a", "ypogegrammenigreekcmb": "\u0345", - "yr": "\u01A6", - "yring": "\u1E99", - "ysuperior": "\u02B8", - "ytilde": "\u1EF9", - "yturned": "\u028E", + "yr": "\u01a6", + "yring": "\u1e99", + "ysuperior": "\u02b8", + "ytilde": "\u1ef9", + "yturned": "\u028e", "yuhiragana": "\u3086", - "yuikorean": "\u318C", - "yukatakana": "\u30E6", - "yukatakanahalfwidth": "\uFF95", + "yuikorean": "\u318c", + "yukatakana": "\u30e6", + "yukatakanahalfwidth": "\uff95", "yukorean": "\u3160", - "yusbigcyrillic": "\u046B", - "yusbigiotifiedcyrillic": "\u046D", + "yusbigcyrillic": "\u046b", + "yusbigiotifiedcyrillic": "\u046d", "yuslittlecyrillic": "\u0467", "yuslittleiotifiedcyrillic": "\u0469", "yusmallhiragana": "\u3085", - "yusmallkatakana": "\u30E5", - "yusmallkatakanahalfwidth": "\uFF6D", - "yuyekorean": "\u318B", - "yuyeokorean": "\u318A", - "yyabengali": "\u09DF", - "yyadeva": "\u095F", - "z": "\u007A", + "yusmallkatakana": "\u30e5", + "yusmallkatakanahalfwidth": "\uff6d", + "yuyekorean": "\u318b", + "yuyeokorean": "\u318a", + "yyabengali": "\u09df", + "yyadeva": "\u095f", + "z": "\u007a", "zaarmenian": "\u0566", - "zacute": "\u017A", - "zadeva": "\u095B", - "zagurmukhi": "\u0A5B", + "zacute": "\u017a", + "zadeva": "\u095b", + "zagurmukhi": "\u0a5b", "zaharabic": "\u0638", - "zahfinalarabic": "\uFEC6", - "zahinitialarabic": "\uFEC7", + "zahfinalarabic": "\ufec6", + "zahinitialarabic": "\ufec7", "zahiragana": "\u3056", - "zahmedialarabic": "\uFEC8", + "zahmedialarabic": "\ufec8", "zainarabic": "\u0632", - "zainfinalarabic": "\uFEB0", - "zakatakana": "\u30B6", + "zainfinalarabic": "\ufeb0", + "zakatakana": "\u30b6", "zaqefgadolhebrew": "\u0595", "zaqefqatanhebrew": "\u0594", "zarqahebrew": "\u0598", - "zayin": "\u05D6", - "zayindagesh": "\uFB36", - "zayindageshhebrew": "\uFB36", - "zayinhebrew": "\u05D6", + "zayin": "\u05d6", + "zayindagesh": "\ufb36", + "zayindageshhebrew": "\ufb36", + "zayinhebrew": "\u05d6", "zbopomofo": "\u3117", - "zcaron": "\u017E", - "zcircle": "\u24E9", - "zcircumflex": "\u1E91", + "zcaron": "\u017e", + "zcircle": "\u24e9", + "zcircumflex": "\u1e91", "zcurl": "\u0291", - "zdot": "\u017C", - "zdotaccent": "\u017C", - "zdotbelow": "\u1E93", + "zdot": "\u017c", + "zdotaccent": "\u017c", + "zdotbelow": "\u1e93", "zecyrillic": "\u0437", "zedescendercyrillic": "\u0499", - "zedieresiscyrillic": "\u04DF", - "zehiragana": "\u305C", - "zekatakana": "\u30BC", + "zedieresiscyrillic": "\u04df", + "zehiragana": "\u305c", + "zekatakana": "\u30bc", "zero": "\u0030", "zeroarabic": "\u0660", - "zerobengali": "\u09E6", + "zerobengali": "\u09e6", "zerodeva": "\u0966", - "zerogujarati": "\u0AE6", - "zerogurmukhi": "\u0A66", + "zerogujarati": "\u0ae6", + "zerogurmukhi": "\u0a66", "zerohackarabic": "\u0660", "zeroinferior": "\u2080", - "zeromonospace": "\uFF10", - "zerooldstyle": "\uF730", - "zeropersian": "\u06F0", + "zeromonospace": "\uff10", + "zerooldstyle": "\uf730", + "zeropersian": "\u06f0", "zerosuperior": "\u2070", - "zerothai": "\u0E50", - "zerowidthjoiner": "\uFEFF", - "zerowidthnonjoiner": "\u200C", - "zerowidthspace": "\u200B", - "zeta": "\u03B6", + "zerothai": "\u0e50", + "zerowidthjoiner": "\ufeff", + "zerowidthnonjoiner": "\u200c", + "zerowidthspace": "\u200b", + "zeta": "\u03b6", "zhbopomofo": "\u3113", - "zhearmenian": "\u056A", - "zhebrevecyrillic": "\u04C2", + "zhearmenian": "\u056a", + "zhebrevecyrillic": "\u04c2", "zhecyrillic": "\u0436", "zhedescendercyrillic": "\u0497", - "zhedieresiscyrillic": "\u04DD", + "zhedieresiscyrillic": "\u04dd", "zihiragana": "\u3058", - "zikatakana": "\u30B8", - "zinorhebrew": "\u05AE", - "zlinebelow": "\u1E95", - "zmonospace": "\uFF5A", - "zohiragana": "\u305E", - "zokatakana": "\u30BE", - "zparen": "\u24B5", + "zikatakana": "\u30b8", + "zinorhebrew": "\u05ae", + "zlinebelow": "\u1e95", + "zmonospace": "\uff5a", + "zohiragana": "\u305e", + "zokatakana": "\u30be", + "zparen": "\u24b5", "zretroflexhook": "\u0290", - "zstroke": "\u01B6", - "zuhiragana": "\u305A", - "zukatakana": "\u30BA", + "zstroke": "\u01b6", + "zuhiragana": "\u305a", + "zukatakana": "\u30ba", } # --end diff --git a/pdfminer/high_level.py b/pdfminer/high_level.py index 93ec2ed1..14722cdf 100644 --- a/pdfminer/high_level.py +++ b/pdfminer/high_level.py @@ -5,20 +5,20 @@ from io import StringIO from typing import Any, BinaryIO, Container, Iterator, Optional, cast -from .pdfexceptions import PDFValueError -from .converter import ( - XMLConverter, +from pdfminer.converter import ( + HOCRConverter, HTMLConverter, - TextConverter, PDFPageAggregator, - HOCRConverter, + TextConverter, + XMLConverter, ) -from .image import ImageWriter -from .layout import LAParams, LTPage -from .pdfdevice import PDFDevice, TagExtractor -from .pdfinterp import PDFResourceManager, PDFPageInterpreter -from .pdfpage import PDFPage -from .utils import open_filename, FileOrName, AnyIO +from pdfminer.image import ImageWriter +from pdfminer.layout import LAParams, LTPage +from pdfminer.pdfdevice import PDFDevice, TagExtractor +from pdfminer.pdfexceptions import PDFValueError +from pdfminer.pdfinterp import PDFPageInterpreter, PDFResourceManager +from pdfminer.pdfpage import PDFPage +from pdfminer.utils import AnyIO, FileOrName, open_filename def extract_text_to_fp( @@ -83,7 +83,11 @@ def extract_text_to_fp( if output_type == "text": device = TextConverter( - rsrcmgr, outfp, codec=codec, laparams=laparams, imagewriter=imagewriter + rsrcmgr, + outfp, + codec=codec, + laparams=laparams, + imagewriter=imagewriter, ) elif output_type == "xml": @@ -109,7 +113,11 @@ def extract_text_to_fp( elif output_type == "hocr": device = HOCRConverter( - rsrcmgr, outfp, codec=codec, laparams=laparams, stripcontrol=strip_control + rsrcmgr, + outfp, + codec=codec, + laparams=laparams, + stripcontrol=strip_control, ) elif output_type == "tag": @@ -117,7 +125,7 @@ def extract_text_to_fp( device = TagExtractor(rsrcmgr, cast(BinaryIO, outfp), codec=codec) else: - msg = f"Output type can be text, html, xml or tag but is " f"{output_type}" + msg = f"Output type can be text, html, xml or tag but is {output_type}" raise PDFValueError(msg) assert device is not None @@ -207,7 +215,11 @@ def extract_pages( device = PDFPageAggregator(resource_manager, laparams=laparams) interpreter = PDFPageInterpreter(resource_manager, device) for page in PDFPage.get_pages( - fp, page_numbers, maxpages=maxpages, password=password, caching=caching + fp, + page_numbers, + maxpages=maxpages, + password=password, + caching=caching, ): interpreter.process_page(page) layout = device.get_result() diff --git a/pdfminer/image.py b/pdfminer/image.py index 52aec4bb..898f2707 100644 --- a/pdfminer/image.py +++ b/pdfminer/image.py @@ -10,18 +10,20 @@ # Literal was introduced in Python 3.8 from typing_extensions import Literal # type: ignore[assignment] -from .jbig2 import JBIG2StreamReader, JBIG2StreamWriter -from .layout import LTImage -from .pdfcolor import LITERAL_DEVICE_CMYK -from .pdfcolor import LITERAL_DEVICE_GRAY -from .pdfcolor import LITERAL_DEVICE_RGB -from .pdftypes import ( +from pdfminer.jbig2 import JBIG2StreamReader, JBIG2StreamWriter +from pdfminer.layout import LTImage +from pdfminer.pdfcolor import ( + LITERAL_DEVICE_CMYK, + LITERAL_DEVICE_GRAY, + LITERAL_DEVICE_RGB, +) +from pdfminer.pdfexceptions import PDFValueError +from pdfminer.pdftypes import ( LITERALS_DCT_DECODE, + LITERALS_FLATE_DECODE, LITERALS_JBIG2_DECODE, LITERALS_JPX_DECODE, - LITERALS_FLATE_DECODE, ) -from .pdfexceptions import PDFValueError PIL_ERROR_MESSAGE = ( "Could not import Pillow. This dependency of pdfminer.six is not " @@ -67,7 +69,13 @@ def __init__(self, fp: BinaryIO, bits: int, width: int, height: int) -> None: ) assert len(info) == 40, str(len(info)) header = struct.pack( - " str: return name def _save_bmp( - self, image: LTImage, width: int, height: int, bytes_per_line: int, bits: int + self, + image: LTImage, + width: int, + height: int, + bytes_per_line: int, + bits: int, ) -> str: """Save a BMP encoded image""" name, path = self._create_unique_image_name(image, ".bmp") @@ -223,8 +236,10 @@ def _save_bytes(self, image: LTImage) -> str: channels = len(image.stream.get_data()) / width / height / (image.bits / 8) with open(path, "wb") as fp: try: - from PIL import Image # type: ignore[import] - from PIL import ImageOps + from PIL import ( + Image, # type: ignore[import] + ImageOps, + ) except ImportError: raise ImportError(PIL_ERROR_MESSAGE) diff --git a/pdfminer/jbig2.py b/pdfminer/jbig2.py index f1e4f7ac..96a8392e 100644 --- a/pdfminer/jbig2.py +++ b/pdfminer/jbig2.py @@ -1,9 +1,9 @@ import math import os -from struct import pack, unpack, calcsize +from struct import calcsize, pack, unpack from typing import BinaryIO, Dict, Iterable, List, Optional, Tuple, Union, cast -from .pdfexceptions import PDFValueError +from pdfminer.pdfexceptions import PDFValueError # segment structure base SEG_STRUCT = [ @@ -32,7 +32,7 @@ SEG_TYPE_END_OF_FILE = 51 # file literals -FILE_HEADER_ID = b"\x97\x4A\x42\x32\x0D\x0A\x1A\x0A" +FILE_HEADER_ID = b"\x97\x4a\x42\x32\x0d\x0a\x1a\x0a" FILE_HEAD_FLAG_SEQUENTIAL = 0b00000001 @@ -45,7 +45,7 @@ def check_flag(flag: int, value: int) -> bool: def masked_value(mask: int, value: int) -> int: - for bit_pos in range(0, 31): + for bit_pos in range(31): if bit_set(bit_pos, mask): return (value & mask) >> bit_pos @@ -53,7 +53,7 @@ def masked_value(mask: int, value: int) -> int: def mask_value(mask: int, value: int) -> int: - for bit_pos in range(0, 31): + for bit_pos in range(31): if bit_set(bit_pos, mask): return (value & (mask >> bit_pos)) << bit_pos @@ -69,7 +69,8 @@ def unpack_int(format: str, buffer: bytes) -> int: JBIG2SegmentFlags = Dict[str, Union[int, bool]] JBIG2RetentionFlags = Dict[str, Union[int, List[int], List[bool]]] JBIG2Segment = Dict[ - str, Union[bool, int, bytes, JBIG2SegmentFlags, JBIG2RetentionFlags] + str, + Union[bool, int, bytes, JBIG2SegmentFlags, JBIG2RetentionFlags], ] @@ -107,7 +108,10 @@ def is_eof(self) -> bool: return False def parse_flags( - self, segment: JBIG2Segment, flags: int, field: bytes + self, + segment: JBIG2Segment, + flags: int, + field: bytes, ) -> JBIG2SegmentFlags: return { "deferred": check_flag(HEADER_FLAG_DEFERRED, flags), @@ -116,7 +120,10 @@ def parse_flags( } def parse_retention_flags( - self, segment: JBIG2Segment, flags: int, field: bytes + self, + segment: JBIG2Segment, + flags: int, + field: bytes, ) -> JBIG2RetentionFlags: ref_count = masked_value(REF_COUNT_SHORT_MASK, flags) retain_segments = [] @@ -164,16 +171,18 @@ def parse_page_assoc(self, segment: JBIG2Segment, page: int, field: bytes) -> in return page def parse_data_length( - self, segment: JBIG2Segment, length: int, field: bytes + self, + segment: JBIG2Segment, + length: int, + field: bytes, ) -> int: if length: if ( cast(JBIG2SegmentFlags, segment["flags"])["type"] == SEG_TYPE_IMMEDIATE_GEN_REGION ) and (length == DATA_LEN_UNKNOWN): - raise NotImplementedError( - "Working with unknown segment length " "is not implemented yet" + "Working with unknown segment length is not implemented yet", ) else: segment["raw_data"] = self.stream.read(length) @@ -194,7 +203,9 @@ def __init__(self, stream: BinaryIO) -> None: self.stream = stream def write_segments( - self, segments: Iterable[JBIG2Segment], fix_last_page: bool = True + self, + segments: Iterable[JBIG2Segment], + fix_last_page: bool = True, ) -> int: data_len = 0 current_page: Optional[int] = None @@ -227,7 +238,9 @@ def write_segments( return data_len def write_file( - self, segments: Iterable[JBIG2Segment], fix_last_page: bool = True + self, + segments: Iterable[JBIG2Segment], + fix_last_page: bool = True, ) -> int: header = FILE_HEADER_ID header_flags = FILE_HEAD_FLAG_SEQUENTIAL @@ -288,7 +301,9 @@ def encode_flags(self, value: JBIG2SegmentFlags, segment: JBIG2Segment) -> bytes return pack(">B", flags) def encode_retention_flags( - self, value: JBIG2RetentionFlags, segment: JBIG2Segment + self, + value: JBIG2RetentionFlags, + segment: JBIG2Segment, ) -> bytes: flags = [] flags_format = ">B" diff --git a/pdfminer/latin_enc.py b/pdfminer/latin_enc.py index 6238745e..c5e83053 100644 --- a/pdfminer/latin_enc.py +++ b/pdfminer/latin_enc.py @@ -1,4 +1,4 @@ -""" Standard encoding tables used in PDF. +"""Standard encoding tables used in PDF. This table is extracted from PDF Reference Manual 1.6, pp.925 "D.1 Latin Character Set and Encodings" diff --git a/pdfminer/layout.py b/pdfminer/layout.py index 18592419..ee27b691 100644 --- a/pdfminer/layout.py +++ b/pdfminer/layout.py @@ -15,24 +15,26 @@ cast, ) -from .pdfcolor import PDFColorSpace -from .pdffont import PDFFont -from .pdfinterp import Color -from .pdfinterp import PDFGraphicState -from .pdftypes import PDFStream -from .pdfexceptions import PDFTypeError, PDFValueError -from .utils import INF, PathSegment -from .utils import LTComponentT -from .utils import Matrix -from .utils import Plane -from .utils import Point -from .utils import Rect -from .utils import apply_matrix_pt -from .utils import bbox2str -from .utils import fsplit -from .utils import get_bound -from .utils import matrix2str -from .utils import uniq +from pdfminer.pdfcolor import PDFColorSpace +from pdfminer.pdfexceptions import PDFTypeError, PDFValueError +from pdfminer.pdffont import PDFFont +from pdfminer.pdfinterp import Color, PDFGraphicState +from pdfminer.pdftypes import PDFStream +from pdfminer.utils import ( + INF, + LTComponentT, + Matrix, + PathSegment, + Plane, + Point, + Rect, + apply_matrix_pt, + bbox2str, + fsplit, + get_bound, + matrix2str, + uniq, +) logger = logging.getLogger(__name__) @@ -101,7 +103,7 @@ def __init__( def _validate(self) -> None: if self.boxes_flow is not None: boxes_flow_err_msg = ( - "LAParam boxes_flow should be None, or a " "number between -1 and +1" + "LAParam boxes_flow should be None, or a number between -1 and +1" ) if not ( isinstance(self.boxes_flow, int) or isinstance(self.boxes_flow, float) @@ -123,14 +125,13 @@ class LTItem: def analyze(self, laparams: LAParams) -> None: """Perform the layout analysis.""" - pass class LTText: """Interface for things that have text""" def __repr__(self) -> str: - return "<{} {!r}>".format(self.__class__.__name__, self.get_text()) + return f"<{self.__class__.__name__} {self.get_text()!r}>" def get_text(self) -> str: """Text contained in this object""" @@ -145,7 +146,7 @@ def __init__(self, bbox: Rect) -> None: self.set_bbox(bbox) def __repr__(self) -> str: - return "<{} {}>".format(self.__class__.__name__, bbox2str(self.bbox)) + return f"<{self.__class__.__name__} {bbox2str(self.bbox)}>" # Disable comparison. def __lt__(self, _: object) -> bool: @@ -211,8 +212,7 @@ def voverlap(self, obj: "LTComponent") -> float: class LTCurve(LTComponent): - """ - A generic Bezier curve + """A generic Bezier curve The parameter `original_path` contains the original pathing information from the pdf (e.g. for reconstructing Bezier Curves). @@ -331,12 +331,7 @@ def __init__(self, name: str, stream: PDFStream, bbox: Rect) -> None: self.colorspace = [self.colorspace] def __repr__(self) -> str: - return "<{}({}) {} {!r}>".format( - self.__class__.__name__, - self.name, - bbox2str(self.bbox), - self.srcsize, - ) + return f"<{self.__class__.__name__}({self.name}) {bbox2str(self.bbox)} {self.srcsize!r}>" class LTAnno(LTItem, LTText): @@ -395,7 +390,7 @@ def __init__( bbox_lower_left = (0, descent + rise) bbox_upper_right = (self.adv, descent + rise + fontsize) (a, b, c, d, e, f) = self.matrix - self.upright = 0 < a * d * scaling and b * c <= 0 + self.upright = a * d * scaling > 0 and b * c <= 0 (x0, y0) = apply_matrix_pt(self.matrix, bbox_lower_left) (x1, y1) = apply_matrix_pt(self.matrix, bbox_upper_right) if x1 < x0: @@ -409,14 +404,7 @@ def __init__( self.size = self.height def __repr__(self) -> str: - return "<{} {} matrix={} font={!r} adv={} text={!r}>".format( - self.__class__.__name__, - bbox2str(self.bbox), - matrix2str(self.matrix), - self.fontname, - self.adv, - self.get_text(), - ) + return f"<{self.__class__.__name__} {bbox2str(self.bbox)} matrix={matrix2str(self.matrix)} font={self.fontname!r} adv={self.adv} text={self.get_text()!r}>" def get_text(self) -> str: return self._text @@ -464,7 +452,7 @@ def add(self, obj: LTComponent) -> None: # type: ignore[override] min(self.y0, obj.y0), max(self.x1, obj.x1), max(self.y1, obj.y1), - ) + ), ) @@ -494,11 +482,7 @@ def __init__(self, word_margin: float) -> None: self.word_margin = word_margin def __repr__(self) -> str: - return "<{} {} {!r}>".format( - self.__class__.__name__, - bbox2str(self.bbox), - self.get_text(), - ) + return f"<{self.__class__.__name__} {bbox2str(self.bbox)} {self.get_text()!r}>" def analyze(self, laparams: LAParams) -> None: for obj in self._objs: @@ -506,7 +490,9 @@ def analyze(self, laparams: LAParams) -> None: LTContainer.add(self, LTAnno("\n")) def find_neighbors( - self, plane: Plane[LTComponentT], ratio: float + self, + plane: Plane[LTComponentT], + ratio: float, ) -> List["LTTextLine"]: raise NotImplementedError @@ -530,10 +516,11 @@ def add(self, obj: LTComponent) -> None: # type: ignore[override] super().add(obj) def find_neighbors( - self, plane: Plane[LTComponentT], ratio: float + self, + plane: Plane[LTComponentT], + ratio: float, ) -> List[LTTextLine]: - """ - Finds neighboring LTTextLineHorizontals in the plane. + """Finds neighboring LTTextLineHorizontals in the plane. Returns a list of other LTTestLineHorizontals in the plane which are close to self. "Close" can be controlled by ratio. The returned objects @@ -557,23 +544,19 @@ def find_neighbors( ] def _is_left_aligned_with(self, other: LTComponent, tolerance: float = 0) -> bool: - """ - Whether the left-hand edge of `other` is within `tolerance`. - """ + """Whether the left-hand edge of `other` is within `tolerance`.""" return abs(other.x0 - self.x0) <= tolerance def _is_right_aligned_with(self, other: LTComponent, tolerance: float = 0) -> bool: - """ - Whether the right-hand edge of `other` is within `tolerance`. - """ + """Whether the right-hand edge of `other` is within `tolerance`.""" return abs(other.x1 - self.x1) <= tolerance def _is_centrally_aligned_with( - self, other: LTComponent, tolerance: float = 0 + self, + other: LTComponent, + tolerance: float = 0, ) -> bool: - """ - Whether the horizontal center of `other` is within `tolerance`. - """ + """Whether the horizontal center of `other` is within `tolerance`.""" return abs((other.x0 + other.x1) / 2 - (self.x0 + self.x1) / 2) <= tolerance def _is_same_height_as(self, other: LTComponent, tolerance: float = 0) -> bool: @@ -596,10 +579,11 @@ def add(self, obj: LTComponent) -> None: # type: ignore[override] super().add(obj) def find_neighbors( - self, plane: Plane[LTComponentT], ratio: float + self, + plane: Plane[LTComponentT], + ratio: float, ) -> List[LTTextLine]: - """ - Finds neighboring LTTextLineVerticals in the plane. + """Finds neighboring LTTextLineVerticals in the plane. Returns a list of other LTTextLineVerticals in the plane which are close to self. "Close" can be controlled by ratio. The returned objects @@ -623,23 +607,19 @@ def find_neighbors( ] def _is_lower_aligned_with(self, other: LTComponent, tolerance: float = 0) -> bool: - """ - Whether the lower edge of `other` is within `tolerance`. - """ + """Whether the lower edge of `other` is within `tolerance`.""" return abs(other.y0 - self.y0) <= tolerance def _is_upper_aligned_with(self, other: LTComponent, tolerance: float = 0) -> bool: - """ - Whether the upper edge of `other` is within `tolerance`. - """ + """Whether the upper edge of `other` is within `tolerance`.""" return abs(other.y1 - self.y1) <= tolerance def _is_centrally_aligned_with( - self, other: LTComponent, tolerance: float = 0 + self, + other: LTComponent, + tolerance: float = 0, ) -> bool: - """ - Whether the vertical center of `other` is within `tolerance`. - """ + """Whether the vertical center of `other` is within `tolerance`.""" return abs((other.y0 + other.y1) / 2 - (self.y0 + self.y1) / 2) <= tolerance def _is_same_width_as(self, other: LTComponent, tolerance: float) -> bool: @@ -659,12 +639,7 @@ def __init__(self) -> None: self.index: int = -1 def __repr__(self) -> str: - return "<{}({}) {} {!r}>".format( - self.__class__.__name__, - self.index, - bbox2str(self.bbox), - self.get_text(), - ) + return f"<{self.__class__.__name__}({self.index}) {bbox2str(self.bbox)} {self.get_text()!r}>" def get_writing_mode(self) -> str: raise NotImplementedError @@ -705,7 +680,7 @@ def analyze(self, laparams: LAParams) -> None: # reorder the objects from top-left to bottom-right. self._objs.sort( key=lambda obj: (1 - boxes_flow) * obj.x0 - - (1 + boxes_flow) * (obj.y0 + obj.y1) + - (1 + boxes_flow) * (obj.y0 + obj.y1), ) @@ -717,7 +692,7 @@ def analyze(self, laparams: LAParams) -> None: # reorder the objects from top-right to bottom-left. self._objs.sort( key=lambda obj: -(1 + boxes_flow) * (obj.x0 + obj.x1) - - (1 - boxes_flow) * obj.y1 + - (1 - boxes_flow) * obj.y1, ) @@ -728,7 +703,9 @@ def __init__(self, bbox: Rect) -> None: # group_objects: group text object to textlines. def group_objects( - self, laparams: LAParams, objs: Iterable[LTComponent] + self, + laparams: LAParams, + objs: Iterable[LTComponent], ) -> Iterator[LTTextLine]: obj0 = None line = None @@ -778,25 +755,23 @@ def group_objects( if (halign and isinstance(line, LTTextLineHorizontal)) or ( valign and isinstance(line, LTTextLineVertical) ): - line.add(obj1) elif line is not None: yield line line = None + elif valign and not halign: + line = LTTextLineVertical(laparams.word_margin) + line.add(obj0) + line.add(obj1) + elif halign and not valign: + line = LTTextLineHorizontal(laparams.word_margin) + line.add(obj0) + line.add(obj1) else: - if valign and not halign: - line = LTTextLineVertical(laparams.word_margin) - line.add(obj0) - line.add(obj1) - elif halign and not valign: - line = LTTextLineHorizontal(laparams.word_margin) - line.add(obj0) - line.add(obj1) - else: - line = LTTextLineHorizontal(laparams.word_margin) - line.add(obj0) - yield line - line = None + line = LTTextLineHorizontal(laparams.word_margin) + line.add(obj0) + yield line + line = None obj0 = obj1 if line is None: line = LTTextLineHorizontal(laparams.word_margin) @@ -805,7 +780,9 @@ def group_objects( yield line def group_textlines( - self, laparams: LAParams, lines: Iterable[LTTextLine] + self, + laparams: LAParams, + lines: Iterable[LTTextLine], ) -> Iterator[LTTextBox]: """Group neighboring lines to textboxes""" plane: Plane[LTTextLine] = Plane(self.bbox) @@ -837,7 +814,9 @@ def group_textlines( yield box def group_textboxes( - self, laparams: LAParams, boxes: Sequence[LTTextBox] + self, + laparams: LAParams, + boxes: Sequence[LTTextBox], ) -> List[LTTextGroup]: """Group textboxes hierarchically. @@ -856,7 +835,6 @@ def group_textboxes( :param boxes: All textbox objects to be grouped. :return: a list that has only one element, the final top level group. """ - ElementT = Union[LTTextBox, LTTextGroup] plane: Plane[ElementT] = Plane(self.bbox) @@ -909,7 +887,8 @@ def isany(obj1: ElementT, obj2: ElementT) -> Set[ElementT]: heapq.heappush(dists, (True, d, id1, id2, obj1, obj2)) continue if isinstance(obj1, (LTTextBoxVertical, LTTextGroupTBRL)) or isinstance( - obj2, (LTTextBoxVertical, LTTextGroupTBRL) + obj2, + (LTTextBoxVertical, LTTextGroupTBRL), ): group: LTTextGroup = LTTextGroupTBRL([obj1, obj2]) else: @@ -982,12 +961,7 @@ def __init__(self, name: str, bbox: Rect, matrix: Matrix) -> None: LTLayoutContainer.__init__(self, bbox) def __repr__(self) -> str: - return "<{}({}) {} matrix={}>".format( - self.__class__.__name__, - self.name, - bbox2str(self.bbox), - matrix2str(self.matrix), - ) + return f"<{self.__class__.__name__}({self.name}) {bbox2str(self.bbox)} matrix={matrix2str(self.matrix)}>" def analyze(self, laparams: LAParams) -> None: if not laparams.all_texts: @@ -1008,9 +982,4 @@ def __init__(self, pageid: int, bbox: Rect, rotate: float = 0) -> None: self.rotate = rotate def __repr__(self) -> str: - return "<{}({!r}) {} rotate={!r}>".format( - self.__class__.__name__, - self.pageid, - bbox2str(self.bbox), - self.rotate, - ) + return f"<{self.__class__.__name__}({self.pageid!r}) {bbox2str(self.bbox)} rotate={self.rotate!r}>" diff --git a/pdfminer/lzw.py b/pdfminer/lzw.py index 30e303fc..8e9585a6 100644 --- a/pdfminer/lzw.py +++ b/pdfminer/lzw.py @@ -2,7 +2,7 @@ from io import BytesIO from typing import BinaryIO, Iterator, List, Optional, cast -from .pdfexceptions import PDFException, PDFEOFError +from pdfminer.pdfexceptions import PDFEOFError, PDFException logger = logging.getLogger(__name__) diff --git a/pdfminer/pdfcolor.py b/pdfminer/pdfcolor.py index 81319e38..da402715 100644 --- a/pdfminer/pdfcolor.py +++ b/pdfminer/pdfcolor.py @@ -1,7 +1,7 @@ import collections from typing import Dict -from .psparser import LIT +from pdfminer.psparser import LIT LITERAL_DEVICE_GRAY = LIT("DeviceGray") LITERAL_DEVICE_RGB = LIT("DeviceRGB") @@ -19,7 +19,7 @@ def __repr__(self) -> str: PREDEFINED_COLORSPACE: Dict[str, PDFColorSpace] = collections.OrderedDict() -for (name, n) in [ +for name, n in [ ("DeviceGray", 1), # default value first ("CalRGB", 3), ("CalGray", 1), diff --git a/pdfminer/pdfdevice.py b/pdfminer/pdfdevice.py index ebe60c03..2374601c 100644 --- a/pdfminer/pdfdevice.py +++ b/pdfminer/pdfdevice.py @@ -1,28 +1,29 @@ from typing import ( + TYPE_CHECKING, BinaryIO, Iterable, List, Optional, Sequence, - TYPE_CHECKING, Union, cast, ) +from pdfminer import utils +from pdfminer.pdfcolor import PDFColorSpace +from pdfminer.pdffont import PDFFont, PDFUnicodeNotDefined +from pdfminer.pdfpage import PDFPage +from pdfminer.pdftypes import PDFStream from pdfminer.psparser import PSLiteral -from . import utils -from .pdfcolor import PDFColorSpace -from .pdffont import PDFFont -from .pdffont import PDFUnicodeNotDefined -from .pdfpage import PDFPage -from .pdftypes import PDFStream -from .utils import Matrix, Point, Rect, PathSegment +from pdfminer.utils import Matrix, PathSegment, Point, Rect if TYPE_CHECKING: - from .pdfinterp import PDFGraphicState - from .pdfinterp import PDFResourceManager - from .pdfinterp import PDFTextState - from .pdfinterp import PDFStackT + from pdfminer.pdfinterp import ( + PDFGraphicState, + PDFResourceManager, + PDFStackT, + PDFTextState, + ) PDFTextSeq = Iterable[Union[int, float, bytes]] @@ -241,7 +242,10 @@ def render_char( class TagExtractor(PDFDevice): def __init__( - self, rsrcmgr: "PDFResourceManager", outfp: BinaryIO, codec: str = "utf-8" + self, + rsrcmgr: "PDFResourceManager", + outfp: BinaryIO, + codec: str = "utf-8", ) -> None: PDFDevice.__init__(self, rsrcmgr) self.outfp = outfp @@ -292,7 +296,7 @@ def begin_tag(self, tag: PSLiteral, props: Optional["PDFStackT"] = None) -> None [ f' {utils.enc(k)}="{utils.make_compat_str(v)}"' for (k, v) in sorted(props.items()) - ] + ], ) out_s = f"<{utils.enc(cast(str, tag.name))}{s}>" self._write(out_s) diff --git a/pdfminer/pdfdocument.py b/pdfminer/pdfdocument.py index 92c8dd41..1c063359 100644 --- a/pdfminer/pdfdocument.py +++ b/pdfminer/pdfdocument.py @@ -2,7 +2,7 @@ import logging import re import struct -from hashlib import sha256, md5, sha384, sha512 +from hashlib import md5, sha256, sha384, sha512 from typing import ( Any, Callable, @@ -22,25 +22,36 @@ from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes -from . import settings -from .arcfour import Arcfour -from .data_structures import NumberTree -from .pdfparser import PDFSyntaxError, PDFParser, PDFStreamParser -from .pdftypes import ( +from pdfminer import settings +from pdfminer.arcfour import Arcfour +from pdfminer.data_structures import NumberTree +from pdfminer.pdfexceptions import ( + PDFException, + PDFKeyError, + PDFObjectNotFound, + PDFTypeError, +) +from pdfminer.pdfparser import PDFParser, PDFStreamParser, PDFSyntaxError +from pdfminer.pdftypes import ( DecipherCallable, PDFStream, decipher_all, + dict_value, int_value, - str_value, list_value, - uint_value, - dict_value, + str_value, stream_value, + uint_value, +) +from pdfminer.psexceptions import PSEOF +from pdfminer.psparser import KWD, LIT, literal_name +from pdfminer.utils import ( + choplist, + decode_text, + format_int_alpha, + format_int_roman, + nunpack, ) -from .pdfexceptions import PDFException, PDFTypeError, PDFObjectNotFound, PDFKeyError -from .psparser import literal_name, LIT, KWD -from .psexceptions import PSEOF -from .utils import choplist, decode_text, nunpack, format_int_roman, format_int_alpha log = logging.getLogger(__name__) @@ -55,8 +66,6 @@ class PDFNoValidXRefWarning(SyntaxWarning): Not used anymore because warnings.warn is replaced by logger.Logger.warn. """ - pass - class PDFNoOutlines(PDFException): pass @@ -84,8 +93,6 @@ class PDFEncryptionWarning(UserWarning): Not used anymore because warnings.warn is replaced by logger.Logger.warn. """ - pass - class PDFTextExtractionNotAllowedWarning(UserWarning): """Legacy warning for PDF that does not allow extraction. @@ -93,8 +100,6 @@ class PDFTextExtractionNotAllowedWarning(UserWarning): Not used anymore because warnings.warn is replaced by logger.Logger.warn. """ - pass - class PDFTextExtractionNotAllowed(PDFEncryptionError): pass @@ -160,9 +165,7 @@ def load(self, parser: PDFParser) -> None: raise PDFNoValidXRef("Unexpected EOF - file corrupted?") f = line.split(b" ") if len(f) != 3: - error_msg = "Invalid XRef format: {!r}, line={!r}".format( - parser, line - ) + error_msg = f"Invalid XRef format: {parser!r}, line={line!r}" raise PDFNoValidXRef(error_msg) (pos_b, genno_b, use_b) = f if use_b != b"n": @@ -286,7 +289,7 @@ def get_trailer(self) -> Dict[str, Any]: return self.trailer def get_objids(self) -> Iterator[int]: - for (start, nobjs) in self.ranges: + for start, nobjs in self.ranges: for i in range(nobjs): assert self.entlen is not None assert self.data is not None @@ -298,7 +301,7 @@ def get_objids(self) -> Iterator[int]: def get_pos(self, objid: int) -> Tuple[Optional[int], int, int]: index = 0 - for (start, nobjs) in self.ranges: + for start, nobjs in self.ranges: if start <= objid and objid < start + nobjs: index += objid - start break @@ -324,7 +327,6 @@ def get_pos(self, objid: int) -> Tuple[Optional[int], int, int]: class PDFStandardSecurityHandler: - PASSWORD_PADDING = ( b"(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08" b"..\x00\xb6\xd0h>\x80/\x0c\xa9\xfedSiz" @@ -332,7 +334,10 @@ class PDFStandardSecurityHandler: supported_revisions: Tuple[int, ...] = (2, 3) def __init__( - self, docid: Sequence[bytes], param: Dict[str, Any], password: str = "" + self, + docid: Sequence[bytes], + param: Dict[str, Any], + password: str = "", ) -> None: self.docid = docid self.param = param @@ -461,7 +466,6 @@ def decrypt_rc4(self, objid: int, genno: int, data: bytes) -> bytes: class PDFStandardSecurityHandlerV4(PDFStandardSecurityHandler): - supported_revisions: Tuple[int, ...] = (4,) def init_params(self) -> None: @@ -534,7 +538,6 @@ def decrypt_aes128(self, objid: int, genno: int, data: bytes) -> bytes: class PDFStandardSecurityHandlerV5(PDFStandardSecurityHandlerV4): - supported_revisions = (5, 6) def init_params(self) -> None: @@ -561,14 +564,18 @@ def authenticate(self, password: str) -> Optional[bytes]: if hash == self.o_hash: hash = self._password_hash(password_b, self.o_key_salt, self.u) cipher = Cipher( - algorithms.AES(hash), modes.CBC(b"\0" * 16), backend=default_backend() + algorithms.AES(hash), + modes.CBC(b"\0" * 16), + backend=default_backend(), ) # type: ignore return cipher.decryptor().update(self.oe) # type: ignore hash = self._password_hash(password_b, self.u_validation_salt) if hash == self.u_hash: hash = self._password_hash(password_b, self.u_key_salt) cipher = Cipher( - algorithms.AES(hash), modes.CBC(b"\0" * 16), backend=default_backend() + algorithms.AES(hash), + modes.CBC(b"\0" * 16), + backend=default_backend(), ) # type: ignore return cipher.decryptor().update(self.ue) # type: ignore return None @@ -578,27 +585,29 @@ def _normalize_password(self, password: str) -> bytes: # saslprep expects non-empty strings, apparently if not password: return b"" - from ._saslprep import saslprep + from pdfminer._saslprep import saslprep password = saslprep(password) return password.encode("utf-8")[:127] def _password_hash( - self, password: bytes, salt: bytes, vector: Optional[bytes] = None + self, + password: bytes, + salt: bytes, + vector: Optional[bytes] = None, ) -> bytes: - """ - Compute password hash depending on revision number - """ + """Compute password hash depending on revision number""" if self.r == 5: return self._r5_password(password, salt, vector) return self._r6_password(password, salt[0:8], vector) def _r5_password( - self, password: bytes, salt: bytes, vector: Optional[bytes] = None + self, + password: bytes, + salt: bytes, + vector: Optional[bytes] = None, ) -> bytes: - """ - Compute the password for revision 5 - """ + """Compute the password for revision 5""" hash = sha256(password) hash.update(salt) if vector is not None: @@ -606,11 +615,12 @@ def _r5_password( return hash.digest() def _r6_password( - self, password: bytes, salt: bytes, vector: Optional[bytes] = None + self, + password: bytes, + salt: bytes, + vector: Optional[bytes] = None, ) -> bytes: - """ - Compute the password for revision 6 - """ + """Compute the password for revision 6""" initial_hash = sha256(password) initial_hash.update(salt) if vector is not None: @@ -678,7 +688,7 @@ def __init__( caching: bool = True, fallback: bool = True, ) -> None: - "Set the document to use a given PDFParser object." + """Set the document to use a given PDFParser object.""" self.caching = caching self.xrefs: List[PDFBaseXRef] = [] self.info = [] @@ -876,8 +886,7 @@ def search(entry: object, level: int) -> Iterator[PDFDocument.OutlineType]: return search(self.catalog["Outlines"], 0) def get_page_labels(self) -> Iterator[str]: - """ - Generate page label strings for the PDF document. + """Generate page label strings for the PDF document. If the document includes page labels, generates strings, one per page. If not, raises PDFNoPageLabels. @@ -909,7 +918,7 @@ def lookup(d: Dict[str, Any]) -> Any: if "Names" in d: objs = list_value(d["Names"]) names = dict( - cast(Iterator[Tuple[Union[str, bytes], Any]], choplist(2, objs)) + cast(Iterator[Tuple[Union[str, bytes], Any]], choplist(2, objs)), ) return names[key] if "Kids" in d: @@ -964,7 +973,10 @@ def find_xref(self, parser: PDFParser) -> int: # read xref table def read_xref_from( - self, parser: PDFParser, start: int, xrefs: List[PDFBaseXRef] + self, + parser: PDFParser, + start: int, + xrefs: List[PDFBaseXRef], ) -> None: """Reads XRefs from the given location.""" parser.seek(start) @@ -1015,7 +1027,7 @@ def labels(self) -> Iterator[str]: # Try to cope, by assuming empty labels for the initial pages ranges.insert(0, (0, {})) - for (next, (start, label_dict_unchecked)) in enumerate(ranges, 1): + for next, (start, label_dict_unchecked) in enumerate(ranges, 1): label_dict = dict_value(label_dict_unchecked) style = label_dict.get("S") prefix = decode_text(str_value(label_dict.get("P", b""))) diff --git a/pdfminer/pdffont.py b/pdfminer/pdffont.py index 932b97ee..e1df40c2 100644 --- a/pdfminer/pdffont.py +++ b/pdfminer/pdffont.py @@ -2,6 +2,7 @@ import struct from io import BytesIO from typing import ( + TYPE_CHECKING, Any, BinaryIO, Dict, @@ -13,43 +14,44 @@ Tuple, Union, cast, - TYPE_CHECKING, ) -from . import settings -from .cmapdb import CMap -from .cmapdb import CMapBase -from .cmapdb import CMapDB -from .cmapdb import CMapParser -from .cmapdb import FileUnicodeMap -from .cmapdb import IdentityUnicodeMap -from .cmapdb import UnicodeMap -from .encodingdb import EncodingDB -from .encodingdb import name2unicode -from .fontmetrics import FONT_METRICS -from .pdftypes import PDFStream -from pdfminer.pdfexceptions import PDFException, PDFValueError, PDFKeyError -from .pdftypes import dict_value -from .pdftypes import int_value -from .pdftypes import list_value -from .pdftypes import num_value -from .pdftypes import resolve1, resolve_all -from .pdftypes import stream_value -from .psparser import KWD +from pdfminer import settings +from pdfminer.cmapdb import ( + CMap, + CMapBase, + CMapDB, + CMapParser, + FileUnicodeMap, + IdentityUnicodeMap, + UnicodeMap, +) +from pdfminer.encodingdb import EncodingDB, name2unicode +from pdfminer.fontmetrics import FONT_METRICS +from pdfminer.pdfexceptions import PDFException, PDFKeyError, PDFValueError +from pdfminer.pdftypes import ( + PDFStream, + dict_value, + int_value, + list_value, + num_value, + resolve1, + resolve_all, + stream_value, +) from pdfminer.psexceptions import PSEOF -from .psparser import LIT -from .psparser import PSKeyword -from .psparser import PSLiteral -from .psparser import PSStackParser -from .psparser import literal_name -from .utils import Matrix, Point -from .utils import Rect -from .utils import apply_matrix_norm -from .utils import choplist -from .utils import nunpack +from pdfminer.psparser import ( + KWD, + LIT, + PSKeyword, + PSLiteral, + PSStackParser, + literal_name, +) +from pdfminer.utils import Matrix, Point, Rect, apply_matrix_norm, choplist, nunpack if TYPE_CHECKING: - from .pdfinterp import PDFResourceManager + from pdfminer.pdfinterp import PDFResourceManager log = logging.getLogger(__name__) @@ -62,7 +64,7 @@ def get_widths(seq: Iterable[object]) -> Dict[int, float]: if isinstance(v, list): if r: char1 = r[-1] - for (i, w) in enumerate(v): + for i, w in enumerate(v): widths[cast(int, char1) + i] = w r = [] elif isinstance(v, (int, float)): # == utils.isnumber(v) @@ -83,7 +85,7 @@ def get_widths2(seq: Iterable[object]) -> Dict[int, Tuple[float, Point]]: if isinstance(v, list): if r: char1 = r[-1] - for (i, (w, vx, vy)) in enumerate(choplist(3, v)): + for i, (w, vx, vy) in enumerate(choplist(3, v)): widths[cast(int, char1) + i] = (w, (vx, vy)) r = [] elif isinstance(v, (int, float)): # == utils.isnumber(v) @@ -104,7 +106,6 @@ def get_metrics(cls, fontname: str) -> Tuple[Dict[str, object], Dict[str, int]]: # int here means that we're not extending PSStackParser with additional types. class Type1FontHeaderParser(PSStackParser[int]): - KEYWORD_BEGIN = KWD(b"begin") KEYWORD_END = KWD(b"end") KEYWORD_DEF = KWD(b"def") @@ -186,17 +187,17 @@ def getdict(data: bytes) -> Dict[int, List[Union[float, int]]]: assert nibble is not None s += nibble value = float(s) - elif 32 <= b0 and b0 <= 246: + elif b0 >= 32 and b0 <= 246: value = b0 - 139 else: b1 = ord(fp.read(1)) - if 247 <= b0 and b0 <= 250: + if b0 >= 247 and b0 <= 250: value = ((b0 - 247) << 8) + b1 + 108 - elif 251 <= b0 and b0 <= 254: + elif b0 >= 251 and b0 <= 254: value = -((b0 - 251) << 8) - b1 - 108 else: b2 = ord(fp.read(1)) - if 128 <= b1: + if b1 >= 128: b1 -= 256 if b0 == 28: value = b1 << 8 | b2 @@ -207,7 +208,6 @@ def getdict(data: bytes) -> Dict[int, List[Union[float, int]]]: class CFFFont: - STANDARD_STRINGS = ( ".notdef", "space", @@ -656,7 +656,7 @@ def __init__(self, name: str, fp: BinaryIO) -> None: if format == b"\x00": # Format 0 (n,) = struct.unpack("B", self.fp.read(1)) - for (code, gid) in enumerate(struct.unpack("B" * n, self.fp.read(n))): + for code, gid in enumerate(struct.unpack("B" * n, self.fp.read(n))): self.code2gid[code] = gid self.gid2code[gid] = code elif format == b"\x01": @@ -679,8 +679,10 @@ def __init__(self, name: str, fp: BinaryIO) -> None: if format == b"\x00": # Format 0 n = self.nglyphs - 1 - for (gid, sid) in enumerate( - cast(Tuple[int, ...], struct.unpack(">" + "H" * n, self.fp.read(2 * n))) + for gid, sid in enumerate( + cast( + Tuple[int, ...], struct.unpack(">" + "H" * n, self.fp.read(2 * n)) + ), ): gid += 1 sidname = self.getstr(sid) @@ -722,11 +724,13 @@ def __init__(self, name: str, fp: BinaryIO) -> None: self.fonttype = fp.read(4) try: (ntables, _1, _2, _3) = cast( - Tuple[int, int, int, int], struct.unpack(">HHHH", fp.read(8)) + Tuple[int, int, int, int], + struct.unpack(">HHHH", fp.read(8)), ) for _ in range(ntables): (name_bytes, tsum, offset, length) = cast( - Tuple[bytes, int, int, int], struct.unpack(">4sLLL", fp.read(16)) + Tuple[bytes, int, int, int], + struct.unpack(">4sLLL", fp.read(16)), ) self.tables[name_bytes] = (offset, length) except struct.error: @@ -745,40 +749,43 @@ def create_unicode_map(self) -> FileUnicodeMap: subtables: List[Tuple[int, int, int]] = [] for i in range(nsubtables): subtables.append( - cast(Tuple[int, int, int], struct.unpack(">HHL", fp.read(8))) + cast(Tuple[int, int, int], struct.unpack(">HHL", fp.read(8))), ) char2gid: Dict[int, int] = {} # Only supports subtable type 0, 2 and 4. - for (platform_id, encoding_id, st_offset) in subtables: + for platform_id, encoding_id, st_offset in subtables: # Skip non-Unicode cmaps. # https://docs.microsoft.com/en-us/typography/opentype/spec/cmap if not (platform_id == 0 or (platform_id == 3 and encoding_id in [1, 10])): continue fp.seek(base_offset + st_offset) (fmttype, fmtlen, fmtlang) = cast( - Tuple[int, int, int], struct.unpack(">HHH", fp.read(6)) + Tuple[int, int, int], + struct.unpack(">HHH", fp.read(6)), ) if fmttype == 0: char2gid.update( enumerate( - cast(Tuple[int, ...], struct.unpack(">256B", fp.read(256))) - ) + cast(Tuple[int, ...], struct.unpack(">256B", fp.read(256))), + ), ) elif fmttype == 2: subheaderkeys = cast( - Tuple[int, ...], struct.unpack(">256H", fp.read(512)) + Tuple[int, ...], + struct.unpack(">256H", fp.read(512)), ) firstbytes = [0] * 8192 - for (i, k) in enumerate(subheaderkeys): + for i, k in enumerate(subheaderkeys): firstbytes[k // 8] = i nhdrs = max(subheaderkeys) // 8 + 1 hdrs: List[Tuple[int, int, int, int, int]] = [] for i in range(nhdrs): (firstcode, entcount, delta, offset) = cast( - Tuple[int, int, int, int], struct.unpack(">HHhH", fp.read(8)) + Tuple[int, int, int, int], + struct.unpack(">HHhH", fp.read(8)), ) hdrs.append((i, firstcode, entcount, delta, fp.tell() - 2 + offset)) - for (i, firstcode, entcount, delta, pos) in hdrs: + for i, firstcode, entcount, delta, pos in hdrs: if not entcount: continue first = firstcode + (firstbytes[i] << 8) @@ -790,7 +797,8 @@ def create_unicode_map(self) -> FileUnicodeMap: char2gid[first + c] = gid elif fmttype == 4: (segcount, _1, _2, _3) = cast( - Tuple[int, int, int, int], struct.unpack(">HHHH", fp.read(8)) + Tuple[int, int, int, int], + struct.unpack(">HHHH", fp.read(8)), ) segcount //= 2 ecs = cast( @@ -811,7 +819,7 @@ def create_unicode_map(self) -> FileUnicodeMap: Tuple[int, ...], struct.unpack(">%dH" % segcount, fp.read(2 * segcount)), ) - for (ec, sc, idd, idr) in zip(ecs, scs, idds, idrs): + for ec, sc, idd, idr in zip(ecs, scs, idds, idrs): if idr: fp.seek(pos + idr) for c in range(sc, ec + 1): @@ -826,7 +834,7 @@ def create_unicode_map(self) -> FileUnicodeMap: raise TrueTypeFont.CMapNotFound # create unicode map unicode_map = FileUnicodeMap() - for (char, gid) in char2gid.items(): + for char, gid in char2gid.items(): unicode_map.add_cid2unichr(gid, char) return unicode_map @@ -870,7 +878,8 @@ def __init__( self.default_width = resolve1(self.default_width) self.leading = num_value(descriptor.get("Leading", 0)) self.bbox = cast( - Rect, list_value(resolve_all(descriptor.get("FontBBox", (0, 0, 0, 0)))) + Rect, + list_value(resolve_all(descriptor.get("FontBBox", (0, 0, 0, 0)))), ) self.hscale = self.vscale = 0.001 @@ -926,7 +935,7 @@ def char_width(self, cid: int) -> float: return self.default_width * self.hscale def char_disp(self, cid: int) -> Union[float, Tuple[Optional[float], float]]: - "Returns an integer for horizontal fonts, a tuple for vertical fonts." + """Returns an integer for horizontal fonts, a tuple for vertical fonts.""" return 0 def string_width(self, s: bytes) -> float: @@ -1048,10 +1057,10 @@ def __init__( self.basefont = "unknown" self.cidsysteminfo = dict_value(spec.get("CIDSystemInfo", {})) cid_registry = resolve1(self.cidsysteminfo.get("Registry", b"unknown")).decode( - "latin1" + "latin1", ) cid_ordering = resolve1(self.cidsysteminfo.get("Ordering", b"unknown")).decode( - "latin1" + "latin1", ) self.cidcoding = f"{cid_registry.strip()}-{cid_ordering.strip()}" self.cmap: CMapBase = self.get_cmap_from_spec(spec, strict) @@ -1090,7 +1099,8 @@ def __init__( else: try: self.unicode_map = CMapDB.get_unicode_map( - self.cidcoding, self.cmap.is_vertical() + self.cidcoding, + self.cmap.is_vertical(), ) except CMapDB.CMapNotFound: pass @@ -1149,16 +1159,13 @@ def _get_cmap_name(spec: Mapping[str, Any], strict: bool) -> str: cmap_name_stream: PDFStream = cast(PDFStream, cmap_name) if "CMapName" in cmap_name_stream: cmap_name = cmap_name_stream.get("CMapName").name - else: - if strict: - raise PDFFontError("CMapName unspecified for encoding") + elif strict: + raise PDFFontError("CMapName unspecified for encoding") return IDENTITY_ENCODER.get(cmap_name, cmap_name) def __repr__(self) -> str: - return "".format( - self.basefont, self.cidcoding - ) + return f"" def is_vertical(self) -> bool: return self.vertical @@ -1170,7 +1177,7 @@ def decode(self, bytes: bytes) -> Iterable[int]: return self.cmap.decode(bytes) def char_disp(self, cid: int) -> Union[float, Tuple[Optional[float], float]]: - "Returns an integer for horizontal fonts, a tuple for vertical fonts." + """Returns an integer for horizontal fonts, a tuple for vertical fonts.""" return self.disps.get(cid, self.default_disp) def to_unichr(self, cid: int) -> str: diff --git a/pdfminer/pdfinterp.py b/pdfminer/pdfinterp.py index 393f8ad4..8ad06a7a 100644 --- a/pdfminer/pdfinterp.py +++ b/pdfminer/pdfinterp.py @@ -3,41 +3,48 @@ from io import BytesIO from typing import Dict, List, Mapping, Optional, Sequence, Tuple, Union, cast -from . import settings -from .cmapdb import CMap -from .cmapdb import CMapBase -from .cmapdb import CMapDB -from .pdfcolor import PDFColorSpace -from .pdfcolor import PREDEFINED_COLORSPACE -from .pdfdevice import PDFDevice -from .pdfdevice import PDFTextSeq -from .pdffont import PDFCIDFont -from .pdffont import PDFFont -from .pdffont import PDFFontError -from .pdffont import PDFTrueTypeFont -from .pdffont import PDFType1Font -from .pdffont import PDFType3Font -from .pdfpage import PDFPage -from .pdftypes import PDFObjRef -from .pdfexceptions import PDFException -from .pdftypes import PDFStream -from .pdftypes import dict_value -from .pdftypes import list_value -from .pdftypes import resolve1 -from .pdftypes import stream_value -from .psparser import KWD -from .psexceptions import PSEOF, PSTypeError -from .psparser import LIT -from .psparser import PSKeyword -from .psparser import PSLiteral -from .psparser import PSStackParser -from .psparser import PSStackType -from .psparser import keyword_name -from .psparser import literal_name -from .utils import MATRIX_IDENTITY -from .utils import Matrix, Point, PathSegment, Rect -from .utils import choplist -from .utils import mult_matrix +from pdfminer import settings +from pdfminer.cmapdb import CMap, CMapBase, CMapDB +from pdfminer.pdfcolor import PREDEFINED_COLORSPACE, PDFColorSpace +from pdfminer.pdfdevice import PDFDevice, PDFTextSeq +from pdfminer.pdfexceptions import PDFException +from pdfminer.pdffont import ( + PDFCIDFont, + PDFFont, + PDFFontError, + PDFTrueTypeFont, + PDFType1Font, + PDFType3Font, +) +from pdfminer.pdfpage import PDFPage +from pdfminer.pdftypes import ( + PDFObjRef, + PDFStream, + dict_value, + list_value, + resolve1, + stream_value, +) +from pdfminer.psexceptions import PSEOF, PSTypeError +from pdfminer.psparser import ( + KWD, + LIT, + PSKeyword, + PSLiteral, + PSStackParser, + PSStackType, + keyword_name, + literal_name, +) +from pdfminer.utils import ( + MATRIX_IDENTITY, + Matrix, + PathSegment, + Point, + Rect, + choplist, + mult_matrix, +) log = logging.getLogger(__name__) @@ -181,9 +188,7 @@ def __init__(self, caching: bool = True) -> None: def get_procset(self, procs: Sequence[object]) -> None: for proc in procs: - if proc is LITERAL_PDF: - pass - elif proc is LITERAL_TEXT: + if proc is LITERAL_PDF or proc is LITERAL_TEXT: pass else: pass @@ -286,9 +291,12 @@ def get_inline_data(self, pos: int, target: bytes = b"EI") -> Tuple[int, bytes]: c = bytes((ci,)) data += c self.charpos += 1 - if len(target) <= i and c.isspace(): - i += 1 - elif i < len(target) and c == (bytes((target[i],))): + if ( + len(target) <= i + and c.isspace() + or i < len(target) + and c == (bytes((target[i],))) + ): i += 1 else: i = 0 @@ -365,31 +373,31 @@ def get_colorspace(spec: object) -> Optional[PDFColorSpace]: name = literal_name(spec[0]) else: name = literal_name(spec) - if name == "ICCBased" and isinstance(spec, list) and 2 <= len(spec): + if name == "ICCBased" and isinstance(spec, list) and len(spec) >= 2: return PDFColorSpace(name, stream_value(spec[1])["N"]) - elif name == "DeviceN" and isinstance(spec, list) and 2 <= len(spec): + elif name == "DeviceN" and isinstance(spec, list) and len(spec) >= 2: return PDFColorSpace(name, len(list_value(spec[1]))) else: return PREDEFINED_COLORSPACE.get(name) - for (k, v) in dict_value(resources).items(): + for k, v in dict_value(resources).items(): log.debug("Resource: %r: %r", k, v) if k == "Font": - for (fontid, spec) in dict_value(v).items(): + for fontid, spec in dict_value(v).items(): objid = None if isinstance(spec, PDFObjRef): objid = spec.objid spec = dict_value(spec) self.fontmap[fontid] = self.rsrcmgr.get_font(objid, spec) elif k == "ColorSpace": - for (csid, spec) in dict_value(v).items(): + for csid, spec in dict_value(v).items(): colorspace = get_colorspace(resolve1(spec)) if colorspace is not None: self.csmap[csid] = colorspace elif k == "ProcSet": self.rsrcmgr.get_procset(list_value(v)) elif k == "XObject": - for (xobjid, xobjstrm) in dict_value(v).items(): + for xobjid, xobjstrm in dict_value(v).items(): self.xobjmap[xobjid] = xobjstrm def init_state(self, ctm: Matrix) -> None: @@ -423,7 +431,8 @@ def get_current_state(self) -> Tuple[Matrix, PDFTextState, PDFGraphicState]: return (self.ctm, self.textstate.copy(), self.graphicstate.copy()) def set_current_state( - self, state: Tuple[Matrix, PDFTextState, PDFGraphicState] + self, + state: Tuple[Matrix, PDFTextState, PDFGraphicState], ) -> None: (self.ctm, self.textstate, self.graphicstate) = state self.device.set_ctm(self.ctm) @@ -480,7 +489,7 @@ def do_i(self, flatness: PDFStackT) -> None: def do_gs(self, name: PDFStackT) -> None: """Set parameters from graphics state parameter dictionary""" - # todo + # TODO def do_m(self, x: PDFStackT, y: PDFStackT) -> None: """Begin new subpath""" @@ -509,19 +518,19 @@ def do_c( cast(float, y2), cast(float, x3), cast(float, y3), - ) + ), ) def do_v(self, x2: PDFStackT, y2: PDFStackT, x3: PDFStackT, y3: PDFStackT) -> None: """Append curved segment to path (initial point replicated)""" self.curpath.append( - ("v", cast(float, x2), cast(float, y2), cast(float, x3), cast(float, y3)) + ("v", cast(float, x2), cast(float, y2), cast(float, x3), cast(float, y3)), ) def do_y(self, x1: PDFStackT, y1: PDFStackT, x3: PDFStackT, y3: PDFStackT) -> None: """Append curved segment to path (final point replicated)""" self.curpath.append( - ("y", cast(float, x1), cast(float, y1), cast(float, x3), cast(float, y3)) + ("y", cast(float, x1), cast(float, y1), cast(float, x3), cast(float, y3)), ) def do_h(self) -> None: @@ -832,7 +841,10 @@ def do_TJ(self, seq: PDFStackT) -> None: return assert self.ncs is not None self.device.render_string( - self.textstate, cast(PDFTextSeq, seq), self.ncs, self.graphicstate.copy() + self.textstate, + cast(PDFTextSeq, seq), + self.ncs, + self.graphicstate.copy(), ) def do_Tj(self, s: PDFStackT) -> None: @@ -895,7 +907,9 @@ def do_Do(self, xobjid_arg: PDFStackT) -> None: resources = self.resources.copy() self.device.begin_figure(xobjid, bbox, matrix) interpreter.render_contents( - resources, [xobj], ctm=mult_matrix(matrix, self.ctm) + resources, + [xobj], + ctm=mult_matrix(matrix, self.ctm), ) self.device.end_figure(xobjid) elif subtype is LITERAL_IMAGE and "Width" in xobj and "Height" in xobj: @@ -932,7 +946,10 @@ def render_contents( This method may be called recursively. """ log.debug( - "render_contents: resources=%r, streams=%r, ctm=%r", resources, streams, ctm + "render_contents: resources=%r, streams=%r, ctm=%r", + resources, + streams, + ctm, ) self.init_resources(resources) self.init_state(ctm) @@ -952,7 +969,8 @@ def execute(self, streams: Sequence[object]) -> None: if isinstance(obj, PSKeyword): name = keyword_name(obj) method = "do_%s" % name.replace("*", "_a").replace('"', "_w").replace( - "'", "_q" + "'", + "_q", ) if hasattr(self, method): func = getattr(self, method) @@ -965,9 +983,8 @@ def execute(self, streams: Sequence[object]) -> None: else: log.debug("exec: %s", name) func() - else: - if settings.STRICT: - error_msg = "Unknown operator: %r" % name - raise PDFInterpreterError(error_msg) + elif settings.STRICT: + error_msg = "Unknown operator: %r" % name + raise PDFInterpreterError(error_msg) else: self.push(obj) diff --git a/pdfminer/pdfpage.py b/pdfminer/pdfpage.py index 9a6fdaf7..bd78cb29 100644 --- a/pdfminer/pdfpage.py +++ b/pdfminer/pdfpage.py @@ -1,17 +1,18 @@ import itertools import logging -from typing import BinaryIO, Container, Dict, Iterator, List, Optional, Tuple, Any - +from typing import Any, BinaryIO, Container, Dict, Iterator, List, Optional, Tuple + +from pdfminer import settings +from pdfminer.pdfdocument import ( + PDFDocument, + PDFNoPageLabels, + PDFTextExtractionNotAllowed, +) +from pdfminer.pdfexceptions import PDFObjectNotFound, PDFValueError +from pdfminer.pdfparser import PDFParser +from pdfminer.pdftypes import dict_value, int_value, list_value, resolve1 +from pdfminer.psparser import LIT from pdfminer.utils import parse_rect -from . import settings -from .pdfdocument import PDFDocument, PDFTextExtractionNotAllowed, PDFNoPageLabels -from .pdfparser import PDFParser -from .pdftypes import dict_value -from .pdfexceptions import PDFObjectNotFound, PDFValueError -from .pdftypes import int_value -from .pdftypes import list_value -from .pdftypes import resolve1 -from .psparser import LIT log = logging.getLogger(__name__) @@ -27,7 +28,8 @@ class PDFPage: of keys and values, which describe the properties of a page and point to its contents. - Attributes: + Attributes + ---------- doc: a PDFDocument object. pageid: any Python object that can uniquely identify the page. attrs: a dictionary of page attributes. @@ -40,10 +42,15 @@ class PDFPage: annots: the page annotations. beads: a chain that represents natural reading order. label: the page's label (typically, the logical page number). + """ def __init__( - self, doc: PDFDocument, pageid: object, attrs: object, label: Optional[str] + self, + doc: PDFDocument, + pageid: object, + attrs: object, + label: Optional[str], ) -> None: """Initialize a page object. @@ -58,7 +65,7 @@ def __init__( self.label = label self.lastmod = resolve1(self.attrs.get("LastModified")) self.resources: Dict[object, object] = resolve1( - self.attrs.get("Resources", dict()) + self.attrs.get("Resources", dict()), ) mediabox_params: List[Any] = [ resolve1(mediabox_param) for mediabox_param in self.attrs["MediaBox"] @@ -83,16 +90,15 @@ def __init__( self.contents: List[object] = contents def __repr__(self) -> str: - return "".format( - self.resources, self.mediabox - ) + return f"" INHERITABLE_ATTRS = {"Resources", "MediaBox", "CropBox", "Rotate"} @classmethod def create_pages(cls, document: PDFDocument) -> Iterator["PDFPage"]: def search( - obj: object, parent: Dict[str, object] + obj: object, + parent: Dict[str, object], ) -> Iterator[Tuple[int, Dict[object, Dict[object, object]]]]: if isinstance(obj, int): objid = obj @@ -102,7 +108,7 @@ def search( # PDFObjRef or PDFStream, but neither is valid for dict_value. objid = obj.objid # type: ignore[attr-defined] tree = dict_value(obj).copy() - for (k, v) in parent.items(): + for k, v in parent.items(): if k in cls.INHERITABLE_ATTRS and k not in tree: tree[k] = v @@ -126,7 +132,7 @@ def search( pages = False if "Pages" in document.catalog: objects = search(document.catalog["Pages"], document.catalog) - for (objid, tree) in objects: + for objid, tree in objects: yield cls(document, objid, tree, next(page_labels)) pages = True if not pages: @@ -170,7 +176,7 @@ def get_pages( ) log.warning(warning_msg) # Process each page contained in the document. - for (pageno, page) in enumerate(cls.create_pages(doc)): + for pageno, page in enumerate(cls.create_pages(doc)): if pagenos and (pageno not in pagenos): continue yield page diff --git a/pdfminer/pdfparser.py b/pdfminer/pdfparser.py index d8772918..b00c2b35 100644 --- a/pdfminer/pdfparser.py +++ b/pdfminer/pdfparser.py @@ -1,21 +1,16 @@ import logging from io import BytesIO -from typing import BinaryIO, TYPE_CHECKING, Optional, Union - -from . import settings -from .casting import safe_int -from .pdftypes import PDFObjRef -from .pdfexceptions import PDFException -from .pdftypes import PDFStream -from .pdftypes import dict_value -from .pdftypes import int_value -from .psparser import KWD -from .psexceptions import PSEOF -from .psparser import PSKeyword -from .psparser import PSStackParser +from typing import TYPE_CHECKING, BinaryIO, Optional, Union + +from pdfminer import settings +from pdfminer.casting import safe_int +from pdfminer.pdfexceptions import PDFException +from pdfminer.pdftypes import PDFObjRef, PDFStream, dict_value, int_value +from pdfminer.psexceptions import PSEOF +from pdfminer.psparser import KWD, PSKeyword, PSStackParser if TYPE_CHECKING: - from .pdfdocument import PDFDocument + from pdfminer.pdfdocument import PDFDocument log = logging.getLogger(__name__) @@ -26,8 +21,7 @@ class PDFSyntaxError(PDFException): # PDFParser stack holds all the base types plus PDFStream, PDFObjRef, and None class PDFParser(PSStackParser[Union[PSKeyword, PDFStream, PDFObjRef, None]]): - """ - PDFParser fetch PDF objects from a file stream. + """PDFParser fetch PDF objects from a file stream. It can handle indirect references by referring to a PDF document set by set_document method. It also reads XRefs at the end of every PDF file. @@ -44,7 +38,7 @@ class PDFParser(PSStackParser[Union[PSKeyword, PDFStream, PDFObjRef, None]]): def __init__(self, fp: BinaryIO) -> None: PSStackParser.__init__(self, fp) - self.doc: Optional["PDFDocument"] = None + self.doc: Optional[PDFDocument] = None self.fallback = False def set_document(self, doc: "PDFDocument") -> None: @@ -60,7 +54,6 @@ def set_document(self, doc: "PDFDocument") -> None: def do_keyword(self, pos: int, token: PSKeyword) -> None: """Handles PDF-related keywords.""" - if token in (self.KEYWORD_XREF, self.KEYWORD_STARTXREF): self.add_results(*self.pop(1)) @@ -137,8 +130,7 @@ def do_keyword(self, pos: int, token: PSKeyword) -> None: class PDFStreamParser(PDFParser): - """ - PDFStreamParser is used to parse PDF content streams + """PDFStreamParser is used to parse PDF content streams that is contained in each page and has instructions for rendering the page. A reference to a PDF document is needed because a PDF content stream can also have diff --git a/pdfminer/pdftypes.py b/pdfminer/pdftypes.py index b6eddb69..d333ec49 100644 --- a/pdfminer/pdftypes.py +++ b/pdfminer/pdftypes.py @@ -6,26 +6,25 @@ Any, Dict, Iterable, + List, Optional, Protocol, - Union, - List, Tuple, + Union, cast, ) from warnings import warn -from . import settings, pdfexceptions -from .ascii85 import ascii85decode -from .ascii85 import asciihexdecode -from .ccitt import ccittfaxdecode -from .lzw import lzwdecode -from .psparser import LIT, PSObject -from .runlength import rldecode -from .utils import apply_png_predictor +from pdfminer import pdfexceptions, settings +from pdfminer.ascii85 import ascii85decode, asciihexdecode +from pdfminer.ccitt import ccittfaxdecode +from pdfminer.lzw import lzwdecode +from pdfminer.psparser import LIT, PSObject +from pdfminer.runlength import rldecode +from pdfminer.utils import apply_png_predictor if TYPE_CHECKING: - from .pdfdocument import PDFDocument + from pdfminer.pdfdocument import PDFDocument logger = logging.getLogger(__name__) @@ -72,7 +71,10 @@ class PDFObject(PSObject): class PDFObjRef(PDFObject): def __init__( - self, doc: Optional["PDFDocument"], objid: int, _: Any = _DEFAULT + self, + doc: Optional["PDFDocument"], + objid: int, + _: Any = _DEFAULT, ) -> None: """Reference to a PDF object. @@ -127,7 +129,7 @@ def resolve_all(x: object, default: object = None) -> Any: if isinstance(x, list): x = [resolve_all(v, default=default) for v in x] elif isinstance(x, dict): - for (k, v) in x.items(): + for k, v in x.items(): x[k] = resolve_all(v, default=default) return x @@ -141,7 +143,7 @@ def decipher_all(decipher: DecipherCallable, objid: int, genno: int, x: object) if isinstance(x, list): x = [decipher_all(decipher, objid, genno, v) for v in x] elif isinstance(x, dict): - for (k, v) in x.items(): + for k, v in x.items(): x[k] = decipher_all(decipher, objid, genno, v) return x @@ -309,7 +311,7 @@ def get_filters(self) -> List[Tuple[Any, Any]]: def decode(self) -> None: assert self.data is None and self.rawdata is not None, str( - (self.data, self.rawdata) + (self.data, self.rawdata), ) data = self.rawdata if self.decipher: @@ -322,7 +324,7 @@ def decode(self) -> None: self.data = data self.rawdata = None return - for (f, params) in filters: + for f, params in filters: if f in LITERALS_FLATE_DECODE: # will get errors if the document is encrypted. try: @@ -353,9 +355,7 @@ def decode(self) -> None: # it does not need to be decoded twice. # Just return the stream to the user. pass - elif f in LITERALS_JBIG2_DECODE: - pass - elif f in LITERALS_JPX_DECODE: + elif f in LITERALS_JBIG2_DECODE or f in LITERALS_JPX_DECODE: pass elif f == LITERAL_CRYPT: # not yet.. @@ -368,14 +368,18 @@ def decode(self) -> None: if pred == 1: # no predictor pass - elif 10 <= pred: + elif pred >= 10: # PNG predictor colors = int_value(params.get("Colors", 1)) columns = int_value(params.get("Columns", 1)) raw_bits_per_component = params.get("BitsPerComponent", 8) bitspercomponent = int_value(raw_bits_per_component) data = apply_png_predictor( - pred, colors, columns, bitspercomponent, data + pred, + colors, + columns, + bitspercomponent, + data, ) else: error_msg = "Unsupported predictor: %r" % pred diff --git a/pdfminer/psparser.py b/pdfminer/psparser.py index 7af110f8..80ec1e18 100755 --- a/pdfminer/psparser.py +++ b/pdfminer/psparser.py @@ -1,8 +1,5 @@ #!/usr/bin/env python3 import io - -# -*- coding: utf-8 -*- - import logging import re from typing import ( @@ -19,8 +16,8 @@ Union, ) -from . import settings, psexceptions -from .utils import choplist +from pdfminer import psexceptions, settings +from pdfminer.utils import choplist log = logging.getLogger(__name__) @@ -36,11 +33,8 @@ class PSObject: """Base class for all PS or PDF-related data types.""" - pass - class PSLiteral(PSObject): - """A class that represents a PostScript literal. Postscript literals are used as identifiers, such as @@ -63,7 +57,6 @@ def __repr__(self) -> str: class PSKeyword(PSObject): - """A class that represents a PostScript keyword. PostScript keywords are a dozen of predefined words. @@ -170,7 +163,6 @@ def keyword_name(x: Any) -> Any: class PSBaseParser: - """Most basic PostScript parser that performs only tokenization.""" BUFSIZ = 4096 @@ -260,7 +252,7 @@ def revreadlines(self) -> Iterator[bytes]: self.fp.seek(0, io.SEEK_END) pos = self.fp.tell() buf = b"" - while 0 < pos: + while pos > 0: prevpos = pos pos = max(0, pos - self.BUFSIZ) self.fp.seek(pos) @@ -500,7 +492,8 @@ def _parse_hexstring(self, s: bytes, i: int) -> int: j = m.start(0) self._curtoken += s[i:j] token = HEX_PAIR.sub( - lambda m: bytes((int(m.group(0), 16),)), SPC.sub(b"", self._curtoken) + lambda m: bytes((int(m.group(0), 16),)), + SPC.sub(b"", self._curtoken), ) self._add_token(token) self._parse1 = self._parse_main @@ -631,7 +624,10 @@ def nextobject(self) -> PSStackEntry[ExtraT]: raise elif isinstance(token, PSKeyword): log.debug( - "do_keyword: pos=%r, token=%r, stack=%r", pos, token, self.curstack + "do_keyword: pos=%r, token=%r, stack=%r", + pos, + token, + self.curstack, ) self.do_keyword(pos, token) else: diff --git a/pdfminer/runlength.py b/pdfminer/runlength.py index 72096600..2774e2ae 100644 --- a/pdfminer/runlength.py +++ b/pdfminer/runlength.py @@ -7,8 +7,7 @@ def rldecode(data: bytes) -> bytes: - """ - RunLength decoder (Adobe version) implementation based on PDF Reference + """RunLength decoder (Adobe version) implementation based on PDF Reference version 1.4 section 3.3.4: The RunLengthDecode filter decodes data that has been encoded in a simple byte-oriented format based on run length. The encoded data diff --git a/pdfminer/utils.py b/pdfminer/utils.py index 0cc5c760..a5b53852 100644 --- a/pdfminer/utils.py +++ b/pdfminer/utils.py @@ -1,12 +1,12 @@ -""" -Miscellaneous Routines. -""" +"""Miscellaneous Routines.""" + import io import pathlib import string import struct from html import escape from typing import ( + TYPE_CHECKING, Any, BinaryIO, Callable, @@ -21,14 +21,13 @@ Tuple, TypeVar, Union, - TYPE_CHECKING, cast, ) -from .pdfexceptions import PDFTypeError, PDFValueError +from pdfminer.pdfexceptions import PDFTypeError, PDFValueError if TYPE_CHECKING: - from .layout import LTComponent + from pdfminer.layout import LTComponent import charset_normalizer # For str encoding detection @@ -42,8 +41,7 @@ class open_filename: - """ - Context manager that allows opening a filename + """Context manager that allows opening a filename (str or pathlib.PurePath type is supported) and closes it on exit, (just like `open`), but does nothing for file-like objects. """ @@ -69,7 +67,7 @@ def __exit__(self, exc_type: object, exc_val: object, exc_tb: object) -> None: def make_compat_bytes(in_str: str) -> bytes: - "Converts to bytes, encoding to unicode." + """Converts to bytes, encoding to unicode.""" assert isinstance(in_str, str), str(type(in_str)) return in_str.encode() @@ -97,7 +95,9 @@ def shorten_str(s: str, size: int) -> str: def compatible_encode_method( - bytesorstring: Union[bytes, str], encoding: str = "utf-8", erraction: str = "ignore" + bytesorstring: Union[bytes, str], + encoding: str = "utf-8", + erraction: str = "ignore", ) -> str: """When Py2 str.encode is called, it often means bytes.encode in Py3. @@ -128,7 +128,11 @@ def paeth_predictor(left: int, above: int, upper_left: int) -> int: def apply_png_predictor( - pred: int, colors: int, columns: int, bitspercomponent: int, data: bytes + pred: int, + colors: int, + columns: int, + bitspercomponent: int, + data: bytes, ) -> bytes: """Reverse the effect of the PNG predictor @@ -173,7 +177,7 @@ def apply_png_predictor( # Raw(x) = Up(x) + Prior(x) # (computed mod 256), where Prior() refers to the decoded bytes of # the prior scanline. - for (up_x, prior_x) in zip(line_encoded, line_above): + for up_x, prior_x in zip(line_encoded, line_above): raw_x = (up_x + prior_x) & 255 raw.append(raw_x) @@ -322,7 +326,7 @@ def get_bound(pts: Iterable[Point]) -> Rect: """Compute a minimal rectangle that covers all the points.""" limit: Rect = (INF, INF, -INF, -INF) (x0, y0, x1, y1) = limit - for (x, y) in pts: + for x, y in pts: x0 = min(x0, x) y0 = min(y0, y) x1 = max(x1, x) @@ -331,7 +335,9 @@ def get_bound(pts: Iterable[Point]) -> Rect: def pick( - seq: Iterable[_T], func: Callable[[_T], float], maxobj: Optional[_T] = None + seq: Iterable[_T], + func: Callable[[_T], float], + maxobj: Optional[_T] = None, ) -> Optional[_T]: """Picks the object obj where func(obj) has the highest value.""" maxscore = None @@ -732,7 +738,7 @@ def extend(self, objs: Iterable[LTComponentT]) -> None: self.add(obj) def add(self, obj: LTComponentT) -> None: - """place an object.""" + """Place an object.""" for k in self._getrange((obj.x0, obj.y0, obj.x1, obj.y1)): if k not in self._grid: r: List[LTComponentT] = [] @@ -744,7 +750,7 @@ def add(self, obj: LTComponentT) -> None: self._objs.add(obj) def remove(self, obj: LTComponentT) -> None: - """displace an object.""" + """Displace an object.""" for k in self._getrange((obj.x0, obj.y0, obj.x1, obj.y1)): try: self._grid[k].remove(obj) @@ -753,7 +759,7 @@ def remove(self, obj: LTComponentT) -> None: self._objs.remove(obj) def find(self, bbox: Rect) -> Iterator[LTComponentT]: - """finds objects that are in a certain area.""" + """Finds objects that are in a certain area.""" (x0, y0, x1, y1) = bbox done = set() for k in self._getrange(bbox): @@ -774,7 +780,6 @@ def find(self, bbox: Rect) -> Iterator[LTComponentT]: def format_int_roman(value: int) -> str: """Format a number as lowercase Roman numerals.""" - assert 0 < value < 4000 result: List[str] = [] index = 0 @@ -800,7 +805,6 @@ def format_int_roman(value: int) -> str: def format_int_alpha(value: int) -> str: """Format a number as lowercase letters a-z, aa-zz, etc.""" - assert value > 0 result: List[str] = [] diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 00000000..45d9b864 --- /dev/null +++ b/ruff.toml @@ -0,0 +1,11 @@ +namespace-packages = ["pdfminer"] + +[lint] +extend-select = [ + "W", # pycodestyle warnings + "I", # isort + "TID" # flake8 tidy imports +] + +[lint.flake8-tidy-imports] +ban-relative-imports = "all" \ No newline at end of file diff --git a/setup.py b/setup.py index 5926e91d..42764e2a 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,6 @@ import sys - from pathlib import Path + from setuptools import setup root_dir = Path(__file__).parent diff --git a/tests/tempfilepath.py b/tests/tempfilepath.py index f847d734..366c26d5 100644 --- a/tests/tempfilepath.py +++ b/tests/tempfilepath.py @@ -1,7 +1,7 @@ """Helper module, which provides a TemporaryFilePath() context manager""" -import tempfile import os +import tempfile class TemporaryFilePath: @@ -12,13 +12,14 @@ class TemporaryFilePath: attempt to delete the file with the generated file name. Example: - + ------- >>> with TemporaryFilePath() as temp_file_name: >>> with open(temp_file_name, "w") as temp_file: >>> temp_file.write("some test data, which goes to the file") >>> # some test code is here which reads data out of temp_file Args: + ---- suffix: If 'suffix' is not None, the file name will end with that suffix, otherwise there will be no suffix. prefix: If 'prefix' is not None, the file name will begin with that @@ -26,6 +27,7 @@ class TemporaryFilePath: dir: If 'dir' is not None, the file will be created in that directory, otherwise a default directory is used. delete: whether the file is deleted at the end (default True) + """ def __init__(self, suffix=None, prefix=None, dir=None, delete=True): @@ -41,7 +43,9 @@ def __enter__(self) -> str: this method only returns the filepath of the non-existing file. """ with tempfile.NamedTemporaryFile( - suffix=self.suffix, prefix=self.prefix, dir=self.dir + suffix=self.suffix, + prefix=self.prefix, + dir=self.dir, ) as file: self.temp_file_name = file.name diff --git a/tests/test_converter.py b/tests/test_converter.py index 17d280cb..afe01372 100644 --- a/tests/test_converter.py +++ b/tests/test_converter.py @@ -1,9 +1,9 @@ import io from tempfile import TemporaryFile -from pdfminer.converter import PDFLayoutAnalyzer, PDFConverter +from pdfminer.converter import PDFConverter, PDFLayoutAnalyzer from pdfminer.high_level import extract_pages -from pdfminer.layout import LTChar, LTContainer, LTRect, LTLine, LTCurve +from pdfminer.layout import LTChar, LTContainer, LTCurve, LTLine, LTRect from pdfminer.pdfinterp import PDFGraphicState from tests.helpers import absolute_sample_path @@ -48,7 +48,7 @@ def test_paint_path_multiple_mlllh(self): assert len(analyzer.cur_item._objs) == 3 def test_paint_path_quadrilaterals(self): - """via https://github.com/pdfminer/pdfminer.six/issues/473""" + """Via https://github.com/pdfminer/pdfminer.six/issues/473""" def parse(path): analyzer = self._get_analyzer() @@ -67,7 +67,7 @@ def get_types(path): ("l", 90, 10), ("l", 10, 10), ("h",), - ] + ], ) == [LTRect] # Same but mllll variation @@ -78,7 +78,7 @@ def get_types(path): ("l", 90, 10), ("l", 10, 10), ("l", 10, 90), - ] + ], ) == [LTRect] # Bowtie shape @@ -89,7 +89,7 @@ def get_types(path): ("l", 190, 90), ("l", 110, 10), ("h",), - ] + ], ) == [LTCurve] # Quadrilateral with one slanted side @@ -100,7 +100,7 @@ def get_types(path): ("l", 290, 10), ("l", 210, 10), ("h",), - ] + ], ) == [LTCurve] # Path with two rect subpaths @@ -116,7 +116,7 @@ def get_types(path): ("l", 390, 10), ("l", 350, 10), ("h",), - ] + ], ) == [LTRect, LTRect] # Path with one rect subpath and one pentagon @@ -133,7 +133,7 @@ def get_types(path): ("l", 490, 10), ("l", 455, 10), ("h",), - ] + ], ) == [LTRect, LTCurve] # Three types of simple lines @@ -151,7 +151,7 @@ def get_types(path): ("m", 10, 10), ("l", 30, 30), ("h",), - ] + ], ) == [LTLine, LTLine, LTLine] # Same as above, but 'ml' variation @@ -166,7 +166,7 @@ def get_types(path): # Diagonal line ("m", 10, 10), ("l", 30, 30), - ] + ], ) == [LTLine, LTLine, LTLine] # There are six lines in this one-page PDF; @@ -194,7 +194,7 @@ def parse(path): [ ("m", 72.41, 433.89), ("c", 72.41, 434.45, 71.96, 434.89, 71.41, 434.89), - ] + ], )[0].pts == [ (72.41, 433.89), (71.41, 434.89), @@ -230,7 +230,7 @@ def parse(path): [ ("m", 72.41, 433.89), ("c", 72.41, 434.45, 71.96, 434.89, 71.41, 434.89), - ] + ], )[0].original_path == [ ("m", (72.41, 433.89)), ("c", (72.41, 434.45), (71.96, 434.89), (71.41, 434.89)), @@ -252,7 +252,7 @@ def parse(path): [ ("m", 72.41, 433.89), ("c", 72.41, 434.45, 71.96, 434.89, 71.41, 434.89), - ] + ], )[0].dashing_style == ([1, 1], 0) def test_paint_path_without_starting_m(self): diff --git a/tests/test_encodingdb.py b/tests/test_encodingdb.py index 11664924..2e30fbaf 100644 --- a/tests/test_encodingdb.py +++ b/tests/test_encodingdb.py @@ -4,40 +4,46 @@ While not in the specification, lowercase unicode often occurs in pdf's. Therefore lowercase unittest variants are added. """ + import pytest -from pdfminer.encodingdb import name2unicode, EncodingDB +from pdfminer.encodingdb import EncodingDB, name2unicode from pdfminer.psparser import PSLiteral def test_name2unicode_name_in_agl(): """The name "Lcommaaccent" has a single component, - which is mapped to the string U+013B by AGL""" - assert "\u013B" == name2unicode("Lcommaaccent") + which is mapped to the string U+013B by AGL + """ + assert name2unicode("Lcommaaccent") == "\u013b" def test_name2unicode_uni(): """The components "Lcommaaccent," "uni013B," and "u013B" - all map to the string U+013B""" - assert "\u013B" == name2unicode("uni013B") + all map to the string U+013B + """ + assert name2unicode("uni013B") == "\u013b" def test_name2unicode_uni_lowercase(): """The components "Lcommaaccent," "uni013B," and "u013B" - all map to the string U+013B""" - assert "\u013B" == name2unicode("uni013b") + all map to the string U+013B + """ + assert name2unicode("uni013b") == "\u013b" def test_name2unicode_uni_with_sequence_of_digits(): """The name "uni20AC0308" has a single component, - which is mapped to the string U+20AC U+0308""" - assert "\u20AC\u0308" == name2unicode("uni20AC0308") + which is mapped to the string U+20AC U+0308 + """ + assert name2unicode("uni20AC0308") == "\u20ac\u0308" def test_name2unicode_uni_with_sequence_of_digits_lowercase(): """The name "uni20AC0308" has a single component, - which is mapped to the string U+20AC U+0308""" - assert "\u20AC\u0308" == name2unicode("uni20ac0308") + which is mapped to the string U+20AC U+0308 + """ + assert name2unicode("uni20ac0308") == "\u20ac\u0308" def test_name2unicode_uni_empty_string(): @@ -45,8 +51,9 @@ def test_name2unicode_uni_empty_string(): which is mapped to a euro-sign. According to the specification this should be mapped to an empty string, - but we also want to support lowercase hexadecimals""" - assert "\u20ac" == name2unicode("uni20ac") + but we also want to support lowercase hexadecimals + """ + assert name2unicode("uni20ac") == "\u20ac" def test_name2unicode_uni_empty_string_long(): @@ -71,74 +78,91 @@ def test_name2unicode_uni_empty_string_long_lowercase(): This form cannot be used to map to the character which is expressed as D801 DC0C in UTF-16, specifically U+1040C. This character can be correctly mapped by using the - glyph name "u1040C.""" + glyph name "u1040C. + """ with pytest.raises(KeyError): name2unicode("uniD801DC0C") def test_name2unicode_uni_pua(): """ "Ogoneksmall" and "uniF6FB" both map to the string that corresponds to - U+F6FB.""" - assert "\uF6FB" == name2unicode("uniF6FB") + U+F6FB. + """ + assert name2unicode("uniF6FB") == "\uf6fb" def test_name2unicode_uni_pua_lowercase(): """ "Ogoneksmall" and "uniF6FB" both map to the string that corresponds to - U+F6FB.""" - assert "\uF6FB" == name2unicode("unif6fb") + U+F6FB. + """ + assert name2unicode("unif6fb") == "\uf6fb" def test_name2unicode_u_with_4_digits(): """The components "Lcommaaccent," "uni013B," and "u013B" all map to the - string U+013B""" - assert "\u013B" == name2unicode("u013B") + string U+013B + """ + assert name2unicode("u013B") == "\u013b" def test_name2unicode_u_with_4_digits_lowercase(): """The components "Lcommaaccent," "uni013B," and "u013B" all map to the - string U+013B""" - assert "\u013B" == name2unicode("u013b") + string U+013B + """ + assert name2unicode("u013b") == "\u013b" def test_name2unicode_u_with_5_digits(): """The name "u1040C" has a single component, which is mapped to the string - U+1040C""" - assert "\U0001040C" == name2unicode("u1040C") + U+1040C + """ + assert name2unicode("u1040C") == "\U0001040c" def test_name2unicode_u_with_5_digits_lowercase(): """The name "u1040C" has a single component, which is mapped to the string - U+1040C""" - assert "\U0001040C" == name2unicode("u1040c") + U+1040C + """ + assert name2unicode("u1040c") == "\U0001040c" def test_name2unicode_multiple_components(): """The name "Lcommaaccent_uni20AC0308_u1040C.alternate" is mapped to the - string U+013B U+20AC U+0308 U+1040C""" - assert "\u013B\u20AC\u0308\U0001040C" == name2unicode( - "Lcommaaccent_uni20AC0308_u1040C.alternate" + string U+013B U+20AC U+0308 U+1040C + """ + assert ( + name2unicode( + "Lcommaaccent_uni20AC0308_u1040C.alternate", + ) + == "\u013b\u20ac\u0308\U0001040c" ) def test_name2unicode_multiple_components_lowercase(): """The name "Lcommaaccent_uni20AC0308_u1040C.alternate" is mapped to the - string U+013B U+20AC U+0308 U+1040C""" - assert "\u013B\u20AC\u0308\U0001040C" == name2unicode( - "Lcommaaccent_uni20ac0308_u1040c.alternate" + string U+013B U+20AC U+0308 U+1040C + """ + assert ( + name2unicode( + "Lcommaaccent_uni20ac0308_u1040c.alternate", + ) + == "\u013b\u20ac\u0308\U0001040c" ) def test_name2unicode_foo(): """The name 'foo' maps to an empty string, because 'foo' is not in AGL, - and because it does not start with a 'u.'""" + and because it does not start with a 'u.' + """ with pytest.raises(KeyError): name2unicode("foo") def test_name2unicode_notdef(): """The name ".notdef" is reduced to an empty string (step 1) - and mapped to an empty string (step 3)""" + and mapped to an empty string (step 3) + """ with pytest.raises(KeyError): name2unicode(".notdef") @@ -146,8 +170,9 @@ def test_name2unicode_notdef(): def test_name2unicode_pua_ogoneksmall(): """ " Ogoneksmall" and "uniF6FB" both map to the string - that corresponds to U+F6FB.""" - assert "\uF6FB" == name2unicode("Ogoneksmall") + that corresponds to U+F6FB. + """ + assert name2unicode("Ogoneksmall") == "\uf6fb" def test_name2unicode_overflow_error(): diff --git a/tests/test_highlevel_extracttext.py b/tests/test_highlevel_extracttext.py index ad9d78c4..454b5fca 100644 --- a/tests/test_highlevel_extracttext.py +++ b/tests/test_highlevel_extracttext.py @@ -157,8 +157,9 @@ def test_line_margin(self): # Extract with line_margin 0.19 should break into 3 separate textboxes. pages = list( extract_pages( - self._get_test_file_path(), laparams=LAParams(line_margin=0.19) - ) + self._get_test_file_path(), + laparams=LAParams(line_margin=0.19), + ), ) self.assertEqual(len(pages), 1) page = pages[0] @@ -172,8 +173,9 @@ def test_line_margin(self): # Extract with line_margin 0.21 should merge into one textbox. pages = list( extract_pages( - self._get_test_file_path(), laparams=LAParams(line_margin=0.21) - ) + self._get_test_file_path(), + laparams=LAParams(line_margin=0.21), + ), ) self.assertEqual(len(pages), 1) page = pages[0] @@ -185,8 +187,9 @@ def test_line_margin(self): def test_no_boxes_flow(self): pages = list( extract_pages( - self._get_test_file_path(), laparams=LAParams(boxes_flow=None) - ) + self._get_test_file_path(), + laparams=LAParams(boxes_flow=None), + ), ) self.assertEqual(len(pages), 1) page = pages[0] diff --git a/tests/test_layout.py b/tests/test_layout.py index 85058cf3..1fc45f95 100644 --- a/tests/test_layout.py +++ b/tests/test_layout.py @@ -2,12 +2,12 @@ from pdfminer.high_level import extract_pages from pdfminer.layout import ( - LTLayoutContainer, LAParams, - LTTextLineHorizontal, - LTTextLineVertical, + LTLayoutContainer, LTTextBoxHorizontal, LTTextBoxVertical, + LTTextLineHorizontal, + LTTextLineVertical, ) from pdfminer.utils import Plane from tests.helpers import absolute_sample_path @@ -15,8 +15,7 @@ class TestGroupTextLines(unittest.TestCase): def test_parent_with_wrong_bbox_returns_non_empty_neighbour_list(self): - """ - LTLayoutContainer.group_textlines() should return all the lines in a + """LTLayoutContainer.group_textlines() should return all the lines in a separate LTTextBoxes if they do not overlap. Even when the bounding box of the parent container does not contain all the lines. """ diff --git a/tests/test_pdfdocument.py b/tests/test_pdfdocument.py index 594e7abe..ec818eaf 100644 --- a/tests/test_pdfdocument.py +++ b/tests/test_pdfdocument.py @@ -3,9 +3,9 @@ import pytest from pdfminer.pdfdocument import PDFDocument, PDFNoPageLabels +from pdfminer.pdfexceptions import PDFObjectNotFound from pdfminer.pdfparser import PDFParser from pdfminer.pdftypes import dict_value, int_value -from pdfminer.pdfexceptions import PDFObjectNotFound from tests.helpers import absolute_sample_path diff --git a/tests/test_pdfencoding.py b/tests/test_pdfencoding.py index ebf6592e..30715e09 100644 --- a/tests/test_pdfencoding.py +++ b/tests/test_pdfencoding.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- -from pdfminer.cmapdb import IdentityCMap, CMap, IdentityCMapByte +from pdfminer.cmapdb import CMap, IdentityCMap, IdentityCMapByte from pdfminer.pdffont import PDFCIDFont from pdfminer.pdftypes import PDFStream from pdfminer.psparser import PSLiteral diff --git a/tests/test_pdfminer_ccitt.py b/tests/test_pdfminer_ccitt.py index 59cb1469..685b043f 100644 --- a/tests/test_pdfminer_ccitt.py +++ b/tests/test_pdfminer_ccitt.py @@ -1,4 +1,4 @@ -from pdfminer.ccitt import CCITTG4Parser, CCITTFaxDecoder +from pdfminer.ccitt import CCITTFaxDecoder, CCITTG4Parser class TestCCITTG4Parser: diff --git a/tests/test_pdfminer_crypto.py b/tests/test_pdfminer_crypto.py index 022d5169..a56ece96 100644 --- a/tests/test_pdfminer_crypto.py +++ b/tests/test_pdfminer_crypto.py @@ -1,9 +1,9 @@ -"""Test of various compression/encoding modules (previously in doctests) -""" +"""Test of various compression/encoding modules (previously in doctests)""" + import binascii from pdfminer.arcfour import Arcfour -from pdfminer.ascii85 import asciihexdecode, ascii85decode +from pdfminer.ascii85 import ascii85decode, asciihexdecode from pdfminer.lzw import lzwdecode from pdfminer.runlength import rldecode @@ -21,7 +21,8 @@ def dehex(b): class TestAscii85: def test_ascii85decode(self): """The sample string is taken from: - http://en.wikipedia.org/w/index.php?title=Ascii85""" + http://en.wikipedia.org/w/index.php?title=Ascii85 + """ assert ascii85decode(b"9jqo^BlbD-BleB1DJ+*+F(f,q") == b"Man is distinguished" assert ascii85decode(b"E,9)oF*2M7/c~>") == b"pleasure." diff --git a/tests/test_pdfminer_psparser.py b/tests/test_pdfminer_psparser.py index 5ed3b409..a1599184 100644 --- a/tests/test_pdfminer_psparser.py +++ b/tests/test_pdfminer_psparser.py @@ -1,8 +1,8 @@ import logging from io import BytesIO -from pdfminer.psparser import KWD, LIT, PSBaseParser, PSStackParser from pdfminer.psexceptions import PSEOF +from pdfminer.psparser import KWD, LIT, PSBaseParser, PSStackParser logger = logging.getLogger(__name__) diff --git a/tests/test_pdfpage.py b/tests/test_pdfpage.py index a99a2f47..bb12fedf 100644 --- a/tests/test_pdfpage.py +++ b/tests/test_pdfpage.py @@ -12,5 +12,5 @@ def test_page_labels(self): with open(path, "rb") as fp: parser = PDFParser(fp) doc = PDFDocument(parser) - for (i, page) in enumerate(PDFPage.create_pages(doc)): + for i, page in enumerate(PDFPage.create_pages(doc)): assert page.label == expected_labels[i] diff --git a/tests/test_tools_dumppdf.py b/tests/test_tools_dumppdf.py index 735556e2..62e2fc39 100644 --- a/tests/test_tools_dumppdf.py +++ b/tests/test_tools_dumppdf.py @@ -11,9 +11,9 @@ def run(filename, options=None): absolute_path = absolute_sample_path(filename) with TemporaryFilePath() as output_file_name: if options: - s = "dumppdf -o {} {} {}".format(output_file_name, options, absolute_path) + s = f"dumppdf -o {output_file_name} {options} {absolute_path}" else: - s = "dumppdf -o {} {}".format(output_file_name, absolute_path) + s = f"dumppdf -o {output_file_name} {absolute_path}" dumppdf.main(s.split(" ")[1:]) diff --git a/tests/test_tools_pdf2txt.py b/tests/test_tools_pdf2txt.py index a6e0ee1a..ff1e0cb6 100644 --- a/tests/test_tools_pdf2txt.py +++ b/tests/test_tools_pdf2txt.py @@ -3,9 +3,9 @@ from shutil import rmtree from tempfile import mkdtemp -import tools.pdf2txt as pdf2txt from tests.helpers import absolute_sample_path from tests.tempfilepath import TemporaryFilePath +from tools import pdf2txt def run(sample_path, options=None): @@ -64,7 +64,8 @@ def test_contrib_2b(self): def test_contrib_issue_350(self): """Regression test for - https://github.com/pdfminer/pdfminer.six/issues/350""" + https://github.com/pdfminer/pdfminer.six/issues/350 + """ run("contrib/issue-00352-asw-oct96-p41.pdf") def test_scancode_patchelf(self): diff --git a/tools/conv_cmap.py b/tools/conv_cmap.py index 452bca52..d3c66880 100755 --- a/tools/conv_cmap.py +++ b/tools/conv_cmap.py @@ -18,7 +18,6 @@ def get_encs(self): def get_maps(self, enc): if enc.endswith("-H"): - (hmapenc, vmapenc) = (enc, None) elif enc == "H": (hmapenc, vmapenc) = ("H", "V") @@ -85,7 +84,7 @@ def pick(unimap): cid = int(values[0]) unimap_h = {} unimap_v = {} - for (enc, value) in zip(encs, values): + for enc, value in zip(encs, values): if enc == "CID": continue if value == "*": @@ -149,7 +148,7 @@ def main(argv): def usage(): print( - "usage: %s [-c enc=codec] output_dir regname [cid2code.txt ...]" % argv[0] + "usage: %s [-c enc=codec] output_dir regname [cid2code.txt ...]" % argv[0], ) return 100 @@ -158,7 +157,7 @@ def usage(): except getopt.GetoptError: return usage() enc2codec = {} - for (k, v) in opts: + for k, v in opts: if k == "-c": (enc, _, codec) = v.partition("=") enc2codec[enc] = codec diff --git a/tools/dumppdf.py b/tools/dumppdf.py index 23e00da5..f88389a9 100755 --- a/tools/dumppdf.py +++ b/tools/dumppdf.py @@ -1,29 +1,25 @@ #!/usr/bin/env python3 """Extract pdf structure in XML format""" + import logging import os.path import re import sys -from typing import Any, Container, Dict, Iterable, List, Optional, TextIO, Union, cast from argparse import ArgumentParser +from typing import Any, Container, Dict, Iterable, List, Optional, TextIO, Union, cast import pdfminer from pdfminer.pdfdocument import PDFDocument, PDFNoOutlines, PDFXRefFallback -from pdfminer.pdfpage import PDFPage -from pdfminer.pdfparser import PDFParser -from pdfminer.pdftypes import ( - PDFStream, - PDFObjRef, - resolve1, - stream_value, -) from pdfminer.pdfexceptions import ( + PDFIOError, + PDFObjectNotFound, PDFTypeError, PDFValueError, - PDFObjectNotFound, - PDFIOError, ) -from pdfminer.psparser import PSKeyword, PSLiteral, LIT +from pdfminer.pdfpage import PDFPage +from pdfminer.pdfparser import PDFParser +from pdfminer.pdftypes import PDFObjRef, PDFStream, resolve1, stream_value +from pdfminer.psparser import LIT, PSKeyword, PSLiteral from pdfminer.utils import isnumber logging.basicConfig() @@ -47,7 +43,7 @@ def dumpxml(out: TextIO, obj: object, codec: Optional[str] = None) -> None: if isinstance(obj, dict): out.write('\n' % len(obj)) - for (k, v) in obj.items(): + for k, v in obj.items(): out.write("%s\n" % k) out.write("") dumpxml(out, v) @@ -106,7 +102,9 @@ def dumpxml(out: TextIO, obj: object, codec: Optional[str] = None) -> None: def dumptrailers( - out: TextIO, doc: PDFDocument, show_fallback_xref: bool = False + out: TextIO, + doc: PDFDocument, + show_fallback_xref: bool = False, ) -> None: for xref in doc.xrefs: if not isinstance(xref, PDFXRefFallback) or show_fallback_xref: @@ -181,7 +179,7 @@ def resolve_dest(dest: object) -> Any: try: outlines = doc.get_outlines() outfp.write("\n") - for (level, title, dest, a, se) in outlines: + for level, title, dest, a, se in outlines: pageno = None if dest: dest = resolve_dest(dest) @@ -227,7 +225,7 @@ def extract1(objid: int, obj: Dict[str, Any]) -> None: if fileobj.get("Type") is not LITERAL_EMBEDDEDFILE: raise PDFValueError( "unable to process PDF: reference for %r " - "is not an EmbeddedFile" % (filename) + "is not an EmbeddedFile" % (filename), ) path = os.path.join(extractdir, "%.6d-%s" % (objid, filename)) if os.path.exists(path): @@ -273,7 +271,7 @@ def dumppdf( obj = doc.getobj(objid) dumpxml(outfp, obj, codec=codec) if pagenos: - for (pageno, page) in enumerate(PDFPage.create_pages(doc)): + for pageno, page in enumerate(PDFPage.create_pages(doc)): if pageno in pagenos: if codec: for obj in page.contents: @@ -322,11 +320,15 @@ def create_parser() -> ArgumentParser: help="Extract structure of outline", ) procedure_parser.add_argument( - "--extract-embedded", "-E", type=str, help="Extract embedded files" + "--extract-embedded", + "-E", + type=str, + help="Extract embedded files", ) parse_params = parser.add_argument_group( - "Parser", description="Used during PDF parsing" + "Parser", + description="Used during PDF parsing", ) parse_params.add_argument( "--page-numbers", @@ -372,7 +374,8 @@ def create_parser() -> ArgumentParser: ) output_params = parser.add_argument_group( - "Output", description="Used during output generation." + "Output", + description="Used during output generation.", ) output_params.add_argument( "--outfile", diff --git a/tools/pdf2txt.py b/tools/pdf2txt.py index 1aaee573..3341690c 100755 --- a/tools/pdf2txt.py +++ b/tools/pdf2txt.py @@ -1,6 +1,8 @@ #!/usr/bin/env python3 """A command line tool for extracting text and images from PDF and -output it to plain text, html, xml or tags.""" +output it to plain text, html, xml or tags. +""" + import argparse import logging import sys @@ -8,8 +10,8 @@ import pdfminer.high_level from pdfminer.layout import LAParams -from pdfminer.utils import AnyIO from pdfminer.pdfexceptions import PDFValueError +from pdfminer.utils import AnyIO logging.basicConfig() @@ -96,7 +98,8 @@ def create_parser() -> argparse.ArgumentParser: ) parse_params = parser.add_argument_group( - "Parser", description="Used during PDF parsing" + "Parser", + description="Used during PDF parsing", ) parse_params.add_argument( "--page-numbers", @@ -138,7 +141,8 @@ def create_parser() -> argparse.ArgumentParser: la_params = LAParams() # will be used for defaults la_param_group = parser.add_argument_group( - "Layout analysis", description="Used during layout analysis." + "Layout analysis", + description="Used during layout analysis.", ) la_param_group.add_argument( "--no-laparams", @@ -212,7 +216,8 @@ def create_parser() -> argparse.ArgumentParser: ) output_params = parser.add_argument_group( - "Output", description="Used during output generation." + "Output", + description="Used during output generation.", ) output_params.add_argument( "--outfile",