48 lines
1.1 KiB
TypeScript
48 lines
1.1 KiB
TypeScript
/**
|
|
* Basic string formatting, akin to `sprintf` or `util.format`, but limited.
|
|
* Only supports `%o` for arrays, `%j` for objects, `%s` for strings and `%d` for numbers.
|
|
*
|
|
* You should really be using template literals instead (developer's note to self, lol).
|
|
* @param fmt Input
|
|
* @param args Arguments
|
|
* @returns Formatted string
|
|
*/
|
|
export function formatstr(fmt: string, ...args: any[]) {
|
|
const re = /(%?)(%([ojds]))/g;
|
|
if (args.length) {
|
|
fmt = fmt.replace(re, function (match, escaped, ptn, flag) {
|
|
let arg = args.shift();
|
|
switch (flag) {
|
|
case 'o':
|
|
if (Array.isArray(arg)) {
|
|
arg = JSON.stringify(arg);
|
|
break;
|
|
}
|
|
case 's':
|
|
arg = '' + arg;
|
|
break;
|
|
case 'd':
|
|
arg = Number(arg);
|
|
break;
|
|
case 'j':
|
|
arg = JSON.stringify(arg);
|
|
break;
|
|
}
|
|
if (!escaped) {
|
|
return arg;
|
|
}
|
|
args.unshift(arg);
|
|
return match;
|
|
});
|
|
}
|
|
|
|
// arguments remain after formatting
|
|
if (args.length) {
|
|
fmt += ' ' + args.join(' ');
|
|
}
|
|
|
|
fmt = fmt.replace('%%', '%');
|
|
|
|
return '' + fmt;
|
|
}
|