| "use strict"; |
| const iconvLite = require("iconv-lite"); |
| const supportedNames = require("./supported-names.json"); |
| const labelsToNames = require("./labels-to-names.json"); |
| |
| const supportedNamesSet = new Set(supportedNames); |
| |
| // https://encoding.spec.whatwg.org/#concept-encoding-get |
| exports.labelToName = label => { |
| label = String(label).trim().toLowerCase(); |
| |
| return labelsToNames[label] || null; |
| }; |
| |
| // https://encoding.spec.whatwg.org/#decode |
| exports.decode = (uint8Array, fallbackEncodingName) => { |
| let encoding = fallbackEncodingName; |
| if (!exports.isSupported(encoding)) { |
| throw new RangeError(`"${encoding}" is not a supported encoding name`); |
| } |
| |
| const bomEncoding = exports.getBOMEncoding(uint8Array); |
| if (bomEncoding !== null) { |
| encoding = bomEncoding; |
| } |
| |
| // iconv-lite will strip BOMs for us, so no need to do the stuff the spec does |
| |
| return iconvLite.decode(uint8Array, encoding); |
| }; |
| |
| // https://github.com/whatwg/html/issues/1910#issuecomment-254017369 |
| exports.getBOMEncoding = uint8Array => { |
| if (uint8Array[0] === 0xFE && uint8Array[1] === 0xFF) { |
| return "UTF-16BE"; |
| } else if (uint8Array[0] === 0xFF && uint8Array[1] === 0xFE) { |
| return "UTF-16LE"; |
| } else if (uint8Array[0] === 0xEF && uint8Array[1] === 0xBB && uint8Array[2] === 0xBF) { |
| return "UTF-8"; |
| } |
| |
| return null; |
| }; |
| |
| exports.isSupported = name => { |
| return supportedNamesSet.has(String(name)); |
| }; |