Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | /** * Generate standardized filename for product image * Pattern: product-{id}-{type}-{index}.webp * Example: product-5-bg-1.webp, product-5-sm-2.webp */ export function generateProductImageFilename( productId: number, imageIndex: number, type: "THUMBNAIL" | "PREVIEW" ): string { const typePrefix = type === "THUMBNAIL" ? "sm" : "bg"; return `product-${productId}-${typePrefix}-${imageIndex}.webp`; } /** * Parse filename to extract product ID and type */ export function parseProductImageFilename(filename: string): { productId: number; index: number; type: "THUMBNAIL" | "PREVIEW"; } | null { const pattern = /^product-(\d+)-(bg|sm)-(\d+)\.webp$/; const match = filename.match(pattern); if (!match) return null; return { productId: parseInt(match[1]), type: match[2] === "bg" ? "PREVIEW" : "THUMBNAIL", index: parseInt(match[3])}; } /** * Get next image index for product */ export function getNextImageIndexFromFiles( productId: number, existingFiles: string[], type: "THUMBNAIL" | "PREVIEW" ): number { const typePrefix = type === "THUMBNAIL" ? "-sm-" : "-bg-"; const productPattern = new RegExp(`^product-${productId}${typePrefix}`); const matchingFiles = existingFiles.filter((f) => productPattern.test(f)); if (matchingFiles.length === 0) return 1; const indices = matchingFiles.map((f) => { const match = f.match(/(\d+)\.webp$/); return match ? parseInt(match[1]) : 0; }); return Math.max(...indices) + 1; } |