Source code for domonic.webapi.encoding

"""
    domonic.webapi.encoding
    ====================================
    https://developer.mozilla.org/en-US/docs/Web/API/Encoding_API
"""

from domonic.javascript import (ArrayBuffer, DataView, Float32Array,
                                Float64Array, Function, Int8Array, Int16Array,
                                Int32Array, String, Uint8Array, Uint16Array,
                                Uint32Array)
from domonic.webapi.streams import ReadableStream

# from domonic.javascript import ArrayBufferView


class TextDecoder:
    def __init__(self, encoding="utf-8"):
        self.encoding = encoding

    def decode(self, bytes_or_buffer):
        if self.encoding == "utf-8":
            # get the bytes from the buffer
            if isinstance(bytes_or_buffer, ReadableStream):
                bytes_or_buffer = bytes_or_buffer.read()
            if isinstance(bytes_or_buffer, ArrayBuffer):
                bytes_or_buffer = bytes_or_buffer.buffer
            if isinstance(
                bytes_or_buffer,
                (
                    Uint8Array,
                    Int8Array,
                    Uint16Array,
                    Int16Array,
                    Int32Array,
                    Uint32Array,
                    Float32Array,
                    Float64Array,
                    DataView,
                ),
            ):
                bytes_or_buffer = bytes_or_buffer.buffer
            # if isinstance(bytes_or_buffer, ArrayBufferView):

            # convert the bytes to a string
            # return bytes_or_buffer.decode("utf-8")
            # return "".join([b.decode('UTF-8') for b in bytes_or_buffer])
            b = bytearray(bytes_or_buffer)
            return b.decode("utf-8")
            # return b.decode("utf-16")

    # def __repr__(self):
    #     return f"<TextDecoder encoding={self.encoding}>"


class TextEncoder:
    def __init__(self, encoding="utf-8"):
        self.encoding = encoding

    def encode(self, string):
        return string.encode(self.encoding)

    def encodeInto(self, string, bytes_or_buffer):
        return bytes_or_buffer.encode(self.encoding)

    def __repr__(self):
        return f"<TextEncoder encoding={self.encoding}>"


[docs]class TextDecoderStream(ReadableStream): def __init__(self, encoding="utf-8"): super().__init__() # self.decoder = TextDecoder(encoding) self.encoding = encoding self.readable = True self.writable = False self.ignoreBOM = False def read(self, size=None): return self.decoder.decode(super().read(size)) def __repr__(self): return f"<TextDecoderStream encoding={self.decoder.encoding}>"
[docs]class TextEncoderStream(ReadableStream): def __init__(self, encoding="utf-8"): super().__init__() # self.encoder = TextEncoder(encoding) self.encoding = encoding self.readable = True self.writable = False def read(self, size=None): return self.encoder.encode(super().read(size)) def __repr__(self): return f"<TextEncoderStream encoding={self.encoder.encoding}>"