diff --git a/src/lib/figure-convert.test.ts b/src/lib/figure-convert.test.ts index ee136b0699..754666e67a 100644 --- a/src/lib/figure-convert.test.ts +++ b/src/lib/figure-convert.test.ts @@ -43,12 +43,25 @@ describe("convertFigurePart", () => { }); describe("convertFigureString", () => { - it("converts full figure string from old to new format", () => { + it("converts full figure string from old to new format (with defaults: exclude shoes, waist, dedupe head)", () => { + const oldFigure = + "hr-11782-40-40.hd-180-7-14.ch-11592-66.lg-10726-79-1408.sh-11764-1408.ha-11958-70-1408.wa-2007-0"; + const newFigure = "hd-180-1.ch-255-66.lg-280-110.sh-305-62"; + expect(convertFigureString(oldFigure)).toBe(newFigure); + }); + + it("includes all parts when options disabled", () => { const oldFigure = "hr-11782-40-40.hd-180-7-14.ch-11592-66.lg-10726-79-1408.sh-11764-1408.ha-11958-70-1408.wa-2007-0"; const newFigure = "hd-180-1.hd-180-1.ch-255-66.lg-280-110.sh-305-62.ha-310-70.wa-200-0"; - expect(convertFigureString(oldFigure)).toBe(newFigure); + expect( + convertFigureString(oldFigure, { + excludeShoes: false, + excludeWaist: false, + dedupeHead: false, + }), + ).toBe(newFigure); }); it("handles empty string", () => { @@ -62,8 +75,15 @@ describe("convertFigureString", () => { }); describe("getNewFormatFigure", () => { - it("converts figure using getNewFormatFigure", () => { + it("converts figure using getNewFormatFigure with defaults", () => { const oldFigure = "hr-11782-40-40.hd-180-7-14.ch-11592-66"; - expect(getNewFormatFigure(oldFigure)).toBe("hd-180-1.hd-180-1.ch-255-66"); + expect(getNewFormatFigure(oldFigure)).toBe("hd-180-1.ch-255-66"); + }); + + it("allows custom options", () => { + const oldFigure = "hr-11782-40-40.hd-180-7-14.ch-11592-66.ha-11958-70-1408"; + expect(getNewFormatFigure(oldFigure, { excludeShoes: false })).toBe( + "hd-180-1.ch-255-66.ha-310-70", + ); }); }); diff --git a/src/lib/figure-convert.ts b/src/lib/figure-convert.ts index 801c258566..3db7899653 100644 --- a/src/lib/figure-convert.ts +++ b/src/lib/figure-convert.ts @@ -98,18 +98,58 @@ export function convertFigurePart(part: string): string { * Example: "hr-11782-40-40.hd-180-7-14.ch-11592-66.lg-10726-79-1408.sh-11764-1408.ha-11958-70-1408.wa-2007-0" * -> "hd-180-1.hd-180-1.ch-255-66.lg-280-110.sh-305-62.ha-310-70.wa-200-0" */ -export function convertFigureString(figure: string): string { +export interface ConvertFigureOptions { + /** Exclude shoes (ha-) */ + excludeShoes?: boolean; + /** Exclude waist (wa-) */ + excludeWaist?: boolean; + /** Remove duplicate head/hair (keep first hd-) */ + dedupeHead?: boolean; +} + +export function convertFigureString( + figure: string, + options: ConvertFigureOptions = {}, +): string { if (!figure) return figure; + const { + excludeShoes = true, + excludeWaist = true, + dedupeHead = true, + } = options; + const parts = figure.split("."); const converted = parts.map(convertFigurePart); - return converted.join("."); + + let result = converted; + if (excludeShoes) { + result = result.filter((p) => !p.startsWith("ha-")); + } + if (excludeWaist) { + result = result.filter((p) => !p.startsWith("wa-")); + } + if (dedupeHead) { + const seen = new Set(); + result = result.filter((p) => { + if (p.startsWith("hd-")) { + if (seen.has("hd")) return false; + seen.add("hd"); + } + return true; + }); + } + + return result.join("."); } /** * Get the new format figure string for a user's look. * Handles both old and new format input. */ -export function getNewFormatFigure(look: string): string { - return convertFigureString(look); +export function getNewFormatFigure( + look: string, + options?: ConvertFigureOptions, +): string { + return convertFigureString(look, options); }