Files
gdm-Servo-model/app/catalog-image-map.ts
2026-08-11 15:37:23 +08:00

94 lines
3.7 KiB
TypeScript

import type { CatalogProduct } from "./catalog-data";
// The ecommerce image archive groups products by family rather than by the
// individual model code used in the PDF catalog. These are the corresponding
// family-level main images copied into public/catalog-products/source-main.
const SOURCE_MAIN_IMAGES = {
"1004": "/catalog-products/source-main/1004-main.png",
"258": "/catalog-products/source-main/258-main.jpg",
"259": "/catalog-products/source-main/259-main.jpg",
"266": "/catalog-products/source-main/266-main.jpg",
"267": "/catalog-products/source-main/267-main.jpg",
"268": "/catalog-products/source-main/268-main.jpg",
"270": "/catalog-products/source-main/270-main.jpg",
"271": "/catalog-products/source-main/271-main.jpg",
"272": "/catalog-products/source-main/272-main.jpg",
"273": "/catalog-products/source-main/273-main.jpg",
"274": "/catalog-products/source-main/274-main.jpg",
"275": "/catalog-products/source-main/275-main.jpg",
"276": "/catalog-products/source-main/276-main.jpg",
"308": "/catalog-products/source-main/308-main.png",
"309": "/catalog-products/source-main/309-main.png",
"310": "/catalog-products/source-main/310-main.png",
"311": "/catalog-products/source-main/311-main.png",
"313": "/catalog-products/source-main/313-main.png",
} as const;
type SourceImageKey = keyof typeof SOURCE_MAIN_IMAGES;
function hasWeight(name: string, grams: string) {
return new RegExp(`${grams}\\s*(?:g|克)`, "i").test(name);
}
function getGearSeries(name: string) {
if (/半金属/.test(name)) return "semi";
if (/全金属|金属/.test(name)) return "metal";
if (/塑胶|塑料/.test(name)) return "plastic";
return null;
}
function getSmallServoImage(name: string): string | null {
if (hasWeight(name, "1\\.7")) return SOURCE_MAIN_IMAGES["1004"];
const gearSeries = getGearSeries(name);
if (hasWeight(name, "2") && gearSeries === "plastic") return SOURCE_MAIN_IMAGES["272"];
if (hasWeight(name, "3\\.7") && gearSeries === "plastic") return SOURCE_MAIN_IMAGES["271"];
if (hasWeight(name, "9")) {
if (gearSeries === "metal") return SOURCE_MAIN_IMAGES["266"];
if (gearSeries === "semi") return SOURCE_MAIN_IMAGES["259"];
if (gearSeries === "plastic") return SOURCE_MAIN_IMAGES["258"];
}
if (hasWeight(name, "17")) {
if (gearSeries === "metal") return SOURCE_MAIN_IMAGES["274"];
if (gearSeries === "plastic") return SOURCE_MAIN_IMAGES["273"];
}
if (hasWeight(name, "25")) {
if (gearSeries === "metal") return SOURCE_MAIN_IMAGES["276"];
if (gearSeries === "plastic") return SOURCE_MAIN_IMAGES["275"];
}
if (hasWeight(name, "37")) {
if (gearSeries === "metal") return SOURCE_MAIN_IMAGES["270"];
if (gearSeries === "semi") return SOURCE_MAIN_IMAGES["268"];
if (gearSeries === "plastic") return SOURCE_MAIN_IMAGES["267"];
}
return null;
}
function getBrickServoImage(name: string): string | null {
if (name.includes("3x3x3")) return SOURCE_MAIN_IMAGES["311"];
if (name.includes("3x3x7")) return SOURCE_MAIN_IMAGES["310"];
if (name.includes("3x7x5")) return SOURCE_MAIN_IMAGES["309"];
if (name.includes("6x6x5")) return SOURCE_MAIN_IMAGES["308"];
if (name.includes("11x5x4")) return SOURCE_MAIN_IMAGES["313"];
return null;
}
export function getCatalogProductImage(product: CatalogProduct) {
if (product.category === "积木舵机") {
return getBrickServoImage(product.name) ?? product.image;
}
if (product.category === "标准舵机" || product.category === "异形舵机") {
return getSmallServoImage(product.name) ?? product.image;
}
return product.image;
}
export const CATALOG_SOURCE_IMAGE_KEYS: SourceImageKey[] = Object.keys(SOURCE_MAIN_IMAGES) as SourceImageKey[];