123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- 'use strict';
- // Adapted from:
- // Copyright (c) 2017-2019 Justin Ridgewell, MIT Licensed, https://github.com/jridgewell/safe-decode-string-component
- // Copyright (c) 2008-2009 Bjoern Hoehrmann <bjoern@hoehrmann.de>, MIT Licensed, http://bjoern.hoehrmann.de/utf-8/decoder/dfa/
- const internals = {};
- exports.decode = function (string) {
- let percentPos = string.indexOf('%');
- if (percentPos === -1) {
- return string;
- }
- let decoded = '';
- let last = 0;
- let codepoint = 0;
- let startOfOctets = percentPos;
- let state = internals.utf8.accept;
- while (percentPos > -1 &&
- percentPos < string.length) {
- const high = internals.resolveHex(string[percentPos + 1], 4);
- const low = internals.resolveHex(string[percentPos + 2], 0);
- const byte = high | low;
- const type = internals.utf8.data[byte];
- state = internals.utf8.data[256 + state + type];
- codepoint = (codepoint << 6) | (byte & internals.utf8.data[364 + type]);
- if (state === internals.utf8.accept) {
- decoded += string.slice(last, startOfOctets);
- decoded += codepoint <= 0xFFFF
- ? String.fromCharCode(codepoint)
- : String.fromCharCode(0xD7C0 + (codepoint >> 10), 0xDC00 + (codepoint & 0x3FF));
- codepoint = 0;
- last = percentPos + 3;
- percentPos = string.indexOf('%', last);
- startOfOctets = percentPos;
- continue;
- }
- if (state === internals.utf8.reject) {
- return null;
- }
- percentPos += 3;
- if (percentPos >= string.length ||
- string[percentPos] !== '%') {
- return null;
- }
- }
- return decoded + string.slice(last);
- };
- internals.resolveHex = function (char, shift) {
- const i = internals.hex[char];
- return i === undefined ? 255 : i << shift;
- };
- internals.hex = {
- '0': 0, '1': 1, '2': 2, '3': 3, '4': 4,
- '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
- 'a': 10, 'A': 10, 'b': 11, 'B': 11, 'c': 12,
- 'C': 12, 'd': 13, 'D': 13, 'e': 14, 'E': 14,
- 'f': 15, 'F': 15
- };
- internals.utf8 = {
- accept: 12,
- reject: 0,
- data: [
- // Maps bytes to character to a transition
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 7,
- 10, 9, 9, 9, 11, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- // Maps a state to a new state when adding a transition
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 12, 0, 0, 0, 0, 24, 36, 48, 60, 72, 84, 96,
- 0, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- // Maps the current transition to a mask that needs to apply to the byte
- 0x7F, 0x3F, 0x3F, 0x3F, 0x00, 0x1F, 0x0F, 0x0F, 0x0F, 0x07, 0x07, 0x07
- ]
- };
|