irclib/src/utility/formatstr.ts

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;
}