Source code for pystrich.aztec
"""Aztec Code encoder.
Public entry: :class:`AztecEncoder`. See :class:`AztecData` for pinning
the character encoding explicitly.
"""
from __future__ import annotations
from typing import Literal
from pystrich.matrix_encoder import Matrix2DEncoder
from .data import AztecData
from .renderer import AZTEC_DEFAULT_QUIET_ZONE, AztecRenderer
from .textencoder import TextEncoder
__all__ = [
"AZTEC_DEFAULT_QUIET_ZONE",
"AztecData",
"AztecEncoder",
"AztecErrorCorrectionLevel",
"AztecSymbolKind",
]
AztecErrorCorrectionLevel = int # percentage 5..95
AztecSymbolKind = Literal["auto", "compact", "full"]
[docs]
class AztecEncoder(Matrix2DEncoder[int]):
"""Encode text as an Aztec Code 2D barcode.
A plain ``str`` is encoded with the narrowest character set that fits:
ASCII, Latin-1 (ECI 3) or UTF-8 (ECI 26). Pass an :class:`AztecData` to
pin the encoding explicitly.
Typical use::
encoder = AztecEncoder("https://github.com/mmulqueen/pyStrich")
encoder.save("aztec.png")
:ivar matrix: 2D list describing the symbol prior to rendering.
:ivar quiet_zone: Width in modules of the white border applied at render time.
:ivar width: Pixel width of the most recently rendered image.
:ivar height: Pixel height of the most recently rendered image.
"""
quiet_zone: int
def __init__(
self,
text: str | AztecData,
*,
ecc: AztecErrorCorrectionLevel = 23,
symbol_kind: AztecSymbolKind = "auto",
layers: int | None = None,
quiet_zone: int = AZTEC_DEFAULT_QUIET_ZONE,
) -> None:
"""Encode ``text`` and build the Aztec matrix.
:param text: The data to encode. A plain ``str`` is auto-encoded;
pass :class:`AztecData` to pin the encoding.
:param ecc: Error correction percentage in 5..95. Default 23.
:param symbol_kind: ``"auto"`` (the default), ``"compact"`` or
``"full"``. With ``"auto"`` the smallest fitting symbol is chosen.
:param layers: Override the data layer count. Requires
``symbol_kind`` to be ``"compact"`` or ``"full"``.
:param quiet_zone: Width of the surrounding white border in modules.
Defaults to :data:`AZTEC_DEFAULT_QUIET_ZONE`.
"""
if not isinstance(text, AztecData):
text = AztecData(text, auto_encoding=True)
encoder = TextEncoder()
self.matrix = encoder.encode(text, ecc_pct=ecc, symbol_kind=symbol_kind, layers=layers)
self.quiet_zone = quiet_zone
self.height = 0
self.width = 0
[docs]
def init_renderer(self) -> AztecRenderer:
"""Construct an :class:`AztecRenderer` for the encoded matrix."""
renderer = AztecRenderer(self.matrix, quiet_zone=self.quiet_zone)
self.width = renderer.width
self.height = renderer.height
return renderer