From 79de3635a33b9bb12a51af68834c1233ff399f5c Mon Sep 17 00:00:00 2001 From: Jared Miller Date: Thu, 25 Dec 2025 10:34:12 -0500 Subject: [PATCH] Split special case mappings into logical groups --- script.js | 64 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/script.js b/script.js index dc336a0..95cdcc6 100644 --- a/script.js +++ b/script.js @@ -61,31 +61,54 @@ searchInput?.addEventListener("input", (event) => { }); }); -const specialCaseMap = { +// OCR/formatting errors from epub conversion +const typoFixes = { + "GAY MA G E": "GAY MAGE", + "MORE ON RIVERS RIVERS": "RIVERS", + "REEK OF WRONG NESS": "REEK OF WRONGNESS", + "WITCH LIGHT": "WITCHLIGHT", +}; + +// truncated possessives and hyphenated terms +const partialMatches = { + "A KING'S": "KINGS", + "KING'": "KINGS", + "MERCHANT'": "MERCHANTS", + "POWER-": "POWER", + "WIZARD'": "WIZARDS", + "WIZARD'S": "WIZARDS", + "WIZARD'S BREEDING PROGRAMME": "BREEDING PROGRAMMES", + "WIZARD'S STAFF": "STAFFS", +}; + +// British/American spelling and verb forms +const spellingVariants = { + AMBUSHED: "AMBUSHES", + BACKLASHES: "BACKLASH OF MAGIC", + CURSED: "CURSES", + "FELLOW TRAVELLER": "FELLOW TRAVELERS", + "FELLOW TRAVELLERS": "FELLOW TRAVELERS", +}; + +// different terms mapping to canonical entries +const synonyms = { "A BARD": "BARDS", "A COURTIER": "COURTIERS", "A DEMON": "DEMONS", "A GODDESS OR GOD": "GODDESSES AND GODS", "A HERBWOMAN": "HERBWOMAN", - "A KING'S": "KINGS", "A MAGIC USER": "MAGIC USERS", "A SEER": "SEER", "A WIZARD": "WIZARDS", - AMBUSHED: "AMBUSHES", ASSASSIN: "ASSASSINS, GUILD OF", ASSASSINS: "ASSASSINS, GUILD OF", - BACKLASHES: "BACKLASH OF MAGIC", BALLAD: "BALLAD, How to Compose a", BALLADS: "BALLAD, How to Compose a", BLOCKED: "MOUNTAIN PASS, BLOCKED", CHILD: "CHILDREN", - CURSED: "CURSES", ETERNAL: "ETERNAL QUEST", "EVIL SPELLS": "SPELLS", FEMALE: "SLAVES, FEMALE,", - "FELLOW TRAVELLER": "FELLOW TRAVELERS", - "FELLOW TRAVELLERS": "FELLOW TRAVELERS", - "GAY MA G E": "GAY MAGE", "GIFT OF SIGHT": "SIGHT", GOD: "GODDESSES AND GODS", GODDESS: "GODDESSES AND GODS", @@ -102,43 +125,40 @@ const specialCaseMap = { "HOW TO INTERACT WITH WIZARDS": "WIZARDS", IMPORT: "IMPORT/EXPORT", "JOURNEY CAKE": "WAYBREAD OR JOURNEY CAKE", - "KING'": "KINGS", "LOST LAND": "LOST LANDS,", "LOST LANDS": "LOST LANDS,", MAGELIGHT: "MAGELIGHT OR MAGEFIRE", MALE: "SLAVES, MALE,", - "MERCHANT'": "MERCHANTS", MINION: "MINIONS OF THE DARK LORD", "MINION OF THE DARK LORD": "MINIONS OF THE DARK LORD", MINIONS: "MINIONS OF THE DARK LORD", - "MORE ON RIVERS": "RIVERS", - "MORE ON RIVERS RIVERS": "RIVERS", MOON: "MOON(S)", + "MORE ON RIVERS": "RIVERS", "MOUNTAIN PASS": "MOUNTAIN PASS, BLOCKED", "NORTHERN BARBARIANS DWELL": "NORTHERN BARBARIANS", PANCELTIC: "PANCELTIC TOURS", "PANCELTIC TOUR": "PANCELTIC TOURS", PENTAGRAM: "PENTAGRAM OR PENTACLE", PENTAGRAMS: "PENTAGRAM OR PENTACLE", - "POWER-": "POWER", "PRACTICE RING": "PRACTICE RING OR COMBAT RING", PRIESTESSES: "HIGH PRIESTESSES", - "SECRET VALLEY": "VALLEYS", RIVERBOAT: "RIVERS", - "REEK OF WRONG NESS": "REEK OF WRONGNESS", + "SECRET VALLEY": "VALLEYS", SLAVE: "GALLEY SLAVE", SLAVES: "SLAVES, MALE,", "STANDING STONES": "STONE CIRCLES", - THIEVES: "THIEVES’ GUILD", - "TOWN COUNCIL": "COUNCIL", + THIEVES: "THIEVES' GUILD", "TOUR COMPANIONS": "COMPANIONS", + "TOWN COUNCIL": "COUNCIL", TROTS: "TROTS, THE", WAYBREAD: "WAYBREAD OR JOURNEY CAKE", - "WITCH LIGHT": "WITCHLIGHT", - "WIZARD'": "WIZARDS", - "WIZARD'S": "WIZARDS", - "WIZARD'S BREEDING PROGRAMME": "BREEDING PROGRAMMES", - "WIZARD'S STAFF": "STAFFS", +}; + +const specialCaseMap = { + ...typoFixes, + ...partialMatches, + ...spellingVariants, + ...synonyms, }; const resolveTerm = (term) => {