mirror of
https://github.com/movie-web/movie-web.git
synced 2024-11-15 07:55:06 +01:00
46 lines
2.0 KiB
JavaScript
46 lines
2.0 KiB
JavaScript
|
/* port of https://github.com/beautify-web/js-beautify/blob/master/python/jsbeautifier/unpackers/packer.py (MIT) */
|
||
|
const unpacker = {
|
||
|
unpack: function (str) {
|
||
|
var params = unpacker.filterargs(str);
|
||
|
var payload = params[0], symtab = params[1], radix = params[2], count = params[3];
|
||
|
if (count !== symtab.length) {
|
||
|
throw new Error("Malformed p.a.c.k.e.r. symtab. (" + count + " != " + symtab.length + ")");
|
||
|
}
|
||
|
var unbase = unpacker.unbaser(radix);
|
||
|
var lookup = (word) => symtab[unbase(word)] || word;
|
||
|
var source = payload.replace(/\b\w+\b/g, lookup);
|
||
|
return source;
|
||
|
},
|
||
|
filterargs: function(str) {
|
||
|
/* [\s\S] insteadof . because javascript has no dotall modifier */
|
||
|
var juicers = [
|
||
|
/}\('([\s\S]*)', *(\d+), *(\d+), *'([\s\S]*)'\.split\('\|'\), *(\d+), *([\s\S]*)\)\)/,
|
||
|
/}\('([\s\S]*)', *(\d+), *(\d+), *'([\s\S]*)'\.split\('\|'\)/
|
||
|
];
|
||
|
for (var c = 0; c < juicers.length; ++c) {
|
||
|
var m, juicer = juicers[c];
|
||
|
// eslint-disable-next-line no-cond-assign
|
||
|
if (m = juicer.exec(str)) {
|
||
|
return [m[1], m[4].split('|'), parseInt(m[2]), parseInt(m[3])];
|
||
|
}
|
||
|
}
|
||
|
throw new Error("Could not make sense of p.a.c.k.e.r data (unexpected code structure)");
|
||
|
},
|
||
|
alphabet: {
|
||
|
62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
|
||
|
95: '!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
|
||
|
},
|
||
|
unbaser: function(base)
|
||
|
{
|
||
|
if (2 <= base <= 36) return (str) => parseInt(str, base);
|
||
|
var dictionary = {};
|
||
|
var alphabet = unpacker.alphabet[base];
|
||
|
if (!alphabet) throw new Error("Unsupported encoding");
|
||
|
for (var c = 0; c < alphabet.length; ++alphabet) {
|
||
|
dictionary[alphabet[c]] = c;
|
||
|
}
|
||
|
return (str) => str.split("").reverse().reduce((cipher, ind) => Math.pow(base, ind) * dictionary[cipher]);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
export { unpacker };
|