cfb-editor/src/utils/misc.js

63 lines
2.1 KiB
JavaScript

/* cfb-editor (C) 2017-present SheetJS -- http://sheetjs.com */
/* global Uint8Array */
import { sprintf, vsprintf } from 'printj';
const X = "%02hhx", Y = X + X + " ";
const FMT = [...Array.from({length:16}).map((x,i) =>
Y.repeat(i>>1) + (i%2 ? X:" ") + " " + " ".repeat(7 - (i >> 1)) + "|" + "%c".repeat(i) + " ".repeat(16-i) + "|\n"
), Y.repeat(8) + "|" + "%c".repeat(16) + "|\n"];
export const line = ([x,d]) => {
if(!d || !d.length) return "";
if(!FMT[d.length]) return "wtf";
return vsprintf("%04x: " + FMT[d.length], [x, ...d, ...d.map(x => String.fromCharCode(x).replace(/[^\x20-\x7E]/g,"."))]);
};
export const fix_string = (x) => x.replace(/[\u0000-\u001f]/, ($$) => sprintf("\\u%04X", $$.charCodeAt(0)));
export const unfix_string = (x) => x.replace(/\\u(\d{4})/g, ($$, $1) => String.fromCharCode(parseInt($1, 16)));
export const format_date = (date/*:Date*/) => sprintf("%02u-%02u-%02u %02u:%02u", date.getUTCMonth()+1, date.getUTCDate(), date.getUTCFullYear()%100, date.getUTCHours(), date.getUTCMinutes());
export const ab2a = (ab) => {
const o = [], u = new Uint8Array(ab);
for(let i = 0; i < u.length; ++i) o[i] = u[i];
return o;
};
export const s2a = x => x.split("").map(x => x.charCodeAt(0));
export const a2s = x => {
const a = new Array(x.length);
for(let i = 0; i < x.length; ++i) a.push(String.fromCharCode(x[i]));
return a.join("");
};
const decode_msi_char = (x) => {
switch(true) {
case x<10: return x + 48;
case x<36: return x + 55;
case x<62: return x + 61;
case x==62: return 46;
}
return 95;
};
export const decode_msi_name = (instr) => {
var ch = instr.charCodeAt(0);
var idx = 0;
var out = [];
if(ch == 0x4840) { ++idx; /*out.push("*");*/ }
while ((ch = instr.charCodeAt(idx++))) {
if(ch >= 0x3800 && ch < 0x4840 ) {
if(ch >= 0x4800) {
ch = decode_msi_char(ch-0x4800);
} else {
ch -= 0x3800;
out.push(String.fromCharCode(decode_msi_char(ch & 0x3f)));
ch = decode_msi_char( (ch>>6) & 0x3f);
}
}
out.push(String.fromCharCode(ch));
}
return out.join("");
};