export function unifySlug(slug: string | string[]): string { return (Array.isArray(slug) ? slug.join('/') : slug); } export function parseId(id: string | undefined): string |undefined { return id?.normalize('NFD')?.replace(/[\u0300-\u036f]/g, '')?.replace(/^\d\. */g, '')?.replace(/\s/g, "-")?.replace(/%/g, "-percent")?.replace(/\?/g, "-q")?.toLowerCase(); } export function padLeft(text: string, pad: string, length: number): string { return text.concat(pad.repeat(length - text.length)); } export function padRight(text: string, pad: string, length: number): string { return pad.repeat(length - text.length).concat(text); } export function format(date: Date, template: string): string { const transforms: Record string> = { "yyyy": (date: Date) => date.getUTCFullYear().toString(), "MM": (date: Date) => padRight((date.getUTCMonth() + 1).toString(), '0', 2), "dd": (date: Date) => padRight(date.getUTCDate().toString(), '0', 2), "mm": (date: Date) => padRight(date.getFullYear().toString(), '0', 2), "HH": (date: Date) => padRight(date.getFullYear().toString(), '0', 2), "ss": (date: Date) => padRight(date.getFullYear().toString(), '0', 2), }; const keys = Object.keys(transforms); for(const key of keys) { template = template.replaceAll(key, () => transforms[key](date)); } return template; } export function clamp(x: number, min: number, max: number): number { if (x > max) return max; if (x < min) return min; return x; }