UNPKG

@fable-org/fable-library-js

Version:

Core library used by F# projects compiled with fable.io

174 lines (173 loc) 6.12 kB
const littleEndian = true; function utf16le_encode(str) { const bytes = new Uint8Array(str.length * 2); const view = new DataView(bytes.buffer); for (let i = 0; i < str.length; i++) { const code = str.charCodeAt(i); view.setUint16(i * 2, code, littleEndian); } return bytes; } function utf16le_decode(bytes) { const array = ArrayBuffer.isView(bytes) ? bytes : Uint8Array.from(bytes); const view = new DataView(array.buffer, array.byteOffset, array.byteLength); const chars = new Array(view.byteLength / 2); for (let i = 0; i < chars.length; i++) { const code = view.getUint16(i * 2, littleEndian); chars[i] = String.fromCharCode(code); } return chars.join(""); } function utf8_encode(str) { let pos = 0; let buf = new Uint8Array(str.length * 3); for (let i = 0; i < str.length; i++) { let code = str.charCodeAt(i); if (code >= 0xD800 && code <= 0xDBFF) { const nextCode = (i < str.length) ? str.charCodeAt(i + 1) : 0; if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) { i += 1; code = (code - 0xD800) * 0x400 + nextCode - 0xDC00 + 0x10000; if (code > 0xFFFF) { buf[pos++] = (0x1E << 3) | (code >>> 18); buf[pos++] = (0x2 << 6) | ((code >>> 12) & 0x3F); buf[pos++] = (0x2 << 6) | ((code >>> 6) & 0x3F); buf[pos++] = (0x2 << 6) | (code & 0x3F); } } else { buf[pos++] = 0xEF; buf[pos++] = 0xBF; buf[pos++] = 0xBD; } } else if (code <= 0x007F) { buf[pos++] = (0x0 << 7) | code; } else if (code <= 0x07FF) { buf[pos++] = (0x6 << 5) | (code >>> 6); buf[pos++] = (0x2 << 6) | (code & 0x3F); } else { buf[pos++] = (0xE << 4) | (code >>> 12); buf[pos++] = (0x2 << 6) | ((code >>> 6) & 0x3F); buf[pos++] = (0x2 << 6) | (code & 0x3F); } } buf = new Uint8Array(buf.buffer.slice(0, pos)); return buf; } function utf8_decode(bytes) { let pos = 0; const decodeUtf8 = () => { const i1 = bytes[pos++]; if ((i1 & 0x80) === 0) { return i1; } else if ((i1 & 0xE0) === 0xC0) { const i2 = bytes[pos++]; return ((i1 & 0x1F) << 6) | (i2 & 0x3F); } else if ((i1 & 0xF0) === 0xE0) { const i2 = bytes[pos++]; const i3 = bytes[pos++]; return ((i1 & 0x0F) << 12) | ((i2 & 0x3F) << 6) | (i3 & 0x3F); } else if ((i1 & 0xF8) === 0xF0) { const i2 = bytes[pos++]; const i3 = bytes[pos++]; const i4 = bytes[pos++]; return ((i1 & 0x07) << 18) | ((i2 & 0x3F) << 12) | ((i3 & 0x3F) << 6) | (i4 & 0x3F); } else { throw new RangeError("Invalid UTF8 byte: " + i1); } }; const chars = new Array(); while (pos < bytes.length) { const code = decodeUtf8(); chars.push(String.fromCodePoint(code)); } return chars.join(""); } class UTF16LE { getBytes(str, index, count) { str = Array.isArray(str) ? str.join("") : str; if (index != null && count != null) { str = str.substring(index, index + count); } else if (index != null) { str = str.substring(index); } if (typeof Buffer !== "undefined") { const bytes = Buffer.from(str, "utf16le"); return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength); } else { return utf16le_encode(str); // polyfill } } getString(bytes, index, count) { const array = ArrayBuffer.isView(bytes) ? bytes : Uint8Array.from(bytes); let buffer = new Uint8Array(array.buffer, array.byteOffset, array.byteLength); if (index != null && count != null) { buffer = buffer.subarray(index, index + count); } else if (index != null) { buffer = buffer.subarray(index); } if (typeof TextDecoder !== "undefined") { return new TextDecoder("utf-16le").decode(buffer); } else if (typeof Buffer !== "undefined") { return Buffer.from(buffer).toString("utf16le"); } else { return utf16le_decode(buffer); // polyfill } } } class UTF8 { getBytes(str, index, count) { str = Array.isArray(str) ? str.join("") : str; if (index != null && count != null) { str = str.substring(index, index + count); } else if (index != null) { str = str.substring(index); } if (typeof TextEncoder !== "undefined") { return new TextEncoder().encode(str); } else if (typeof Buffer !== "undefined") { const bytes = Buffer.from(str, "utf8"); return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength); } else { return utf8_encode(str); // polyfill } } getString(bytes, index, count) { const array = ArrayBuffer.isView(bytes) ? bytes : Uint8Array.from(bytes); let buffer = new Uint8Array(array.buffer, array.byteOffset, array.byteLength); if (index != null && count != null) { buffer = buffer.subarray(index, index + count); } else if (index != null) { buffer = buffer.subarray(index); } if (typeof TextDecoder !== "undefined") { return new TextDecoder().decode(buffer); } else if (typeof Buffer !== "undefined") { return Buffer.from(buffer).toString("utf8"); } else { return utf8_decode(buffer); // polyfill } } } const _UTF16 = new UTF16LE(); const _UTF8 = new UTF8(); export function get_Unicode() { return _UTF16; } export function get_UTF8() { return _UTF8; }