Zum Inhalt

src/lib/filename.ts

// src/lib/filename.ts
// Shared filename builder for capture artefacts (PNG export, video recording, …).

// Combining diacritical marks (U+0300–U+036F) — written with the Unicode
// `u` flag so the range survives biome's noMisleadingCharacterClass check.
const COMBINING_MARKS = /\p{Mn}+/gu;

function slug(input: string): string {
  return (
    input
      .toLowerCase()
      .normalize('NFKD')
      .replace(COMBINING_MARKS, '')
      .replace(/[^a-z0-9]+/g, '-')
      .replace(/(^-|-$)/g, '') || 'preset'
  );
}

function timestamp(d: Date = new Date()): string {
  const pad = (n: number) => String(n).padStart(2, '0');
  return (
    `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}` +
    `-${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`
  );
}

/** `physarum-<preset-slug>-<YYYYMMDD-HHmmss>.<ext>` */
export function captureFilename(presetName: string, ext: string): string {
  return `physarum-${slug(presetName)}-${timestamp()}.${ext}`;
}