From 3e62e54274db40ae4fe0adbcebf044135742f819 Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 7 Apr 2026 15:34:28 +0200 Subject: [PATCH] Strip all angle brackets in PF2e attack traits and damage Broaden stripDiceBrackets to stripAngleBrackets to handle all PF2e tools angle-bracket formatting (e.g. <10 feet>, <15 feet>), not just dice notation. Also strip in damage text. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../__tests__/pf2e-bestiary-adapter.test.ts | 32 +++++++++++++++++-- .../web/src/adapters/pf2e-bestiary-adapter.ts | 10 +++--- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/apps/web/src/adapters/__tests__/pf2e-bestiary-adapter.test.ts b/apps/web/src/adapters/__tests__/pf2e-bestiary-adapter.test.ts index 9e964ab..e2cc9ec 100644 --- a/apps/web/src/adapters/__tests__/pf2e-bestiary-adapter.test.ts +++ b/apps/web/src/adapters/__tests__/pf2e-bestiary-adapter.test.ts @@ -114,8 +114,8 @@ describe("normalizePf2eBestiary", () => { }); }); - describe("attack traits formatting", () => { - it("strips angle-bracket dice notation from traits", () => { + describe("attack formatting", () => { + it("strips angle brackets from traits", () => { const [creature] = normalizePf2eBestiary({ creature: [ minimalCreature({ @@ -140,6 +140,34 @@ describe("normalizePf2eBestiary", () => { }), ); }); + + it("strips angle brackets from reach values in traits", () => { + const [creature] = normalizePf2eBestiary({ + creature: [ + minimalCreature({ + attacks: [ + { + name: "tentacle", + range: "Melee", + attack: 18, + traits: ["agile", "chaotic", "magical", "reach <10 feet>"], + damage: "2d8+6 piercing", + }, + ], + }), + ], + }); + const attack = creature.attacks?.[0]; + expect(attack).toBeDefined(); + expect(attack?.segments[0]).toEqual( + expect.objectContaining({ + type: "text", + value: expect.stringContaining( + "(agile, chaotic, magical, reach 10 feet)", + ), + }), + ); + }); }); describe("resistances formatting", () => { diff --git a/apps/web/src/adapters/pf2e-bestiary-adapter.ts b/apps/web/src/adapters/pf2e-bestiary-adapter.ts index 2c1b7ba..d2281de 100644 --- a/apps/web/src/adapters/pf2e-bestiary-adapter.ts +++ b/apps/web/src/adapters/pf2e-bestiary-adapter.ts @@ -79,8 +79,8 @@ function capitalize(s: string): string { return s.charAt(0).toUpperCase() + s.slice(1); } -function stripDiceBrackets(s: string): string { - return s.replaceAll(/<(\d*d\d+)>/g, "$1"); +function stripAngleBrackets(s: string): string { + return s.replaceAll(/<([^>]+)>/g, "$1"); } function makeCreatureId(source: string, name: string): CreatureId { @@ -263,9 +263,11 @@ function normalizeAttacks( const attackMod = a.attack == null ? "" : ` +${a.attack}`; const traits = a.traits && a.traits.length > 0 - ? ` (${a.traits.map((t) => stripDiceBrackets(stripTags(t))).join(", ")})` + ? ` (${a.traits.map((t) => stripAngleBrackets(stripTags(t))).join(", ")})` : ""; - const damage = a.damage ? `, ${stripTags(a.damage)}` : ""; + const damage = a.damage + ? `, ${stripAngleBrackets(stripTags(a.damage))}` + : ""; return { name: capitalize(stripTags(a.name)), segments: [