Module:Utility

--- -- This module provides utility functions for several other modules, so that -- there are not require/dependency loops. -- -- The template requires at least one of its two arguments. The first is called -- "product". and the second is called "building". Both are passed to the -- RecipeData module, which returns one or more recipes. -- -- Using the recipe data returned, this module creates an HTML table that -- displays the recipes, which replaces the template, whereever it is written -- in the wiki markup. The table will have exactly one row if both the product -- and building are specified. If either is missing, then expect a table with -- multiple rows. -- @module Utility local Utility = {}

--- -- Normalizes a building name for use as the key in other lookup tables. -- -- This function at least makes the argument lowercase, since keys are -- lowercase to reduce the number of similarities to normalize. -- @param buildingName the in-game name -- @return a normalized name for use as a key function Utility.normalizeBuildingName(buildingName) -- no matter what, we want to return the lowercase version buildingName = string.lower(buildingName) -- No other functions should have this lookup table, so it's defined -- locally to this function. The keys are the possible ways the name could -- be written. The values are the normalized string that are used as keys. local tBuildingSimilarities = { -- Starting Buildings ["ancienthearth"] =  "ancient hearth", ["ancienthearths"] = "ancient hearth", ["ancient hearths"] = "ancient hearth", ["mainwarehouse"] =  "main warehouse", ["mainwarehouses"] = "main warehouse", ["main warehouses"] = "main warehouse", -- Camps ["forager"] =        "foragers' camp", ["foragerscamp"] =   "foragers' camp", ["forager'scamp"] =  "foragers' camp", ["foragers'camp"] =  "foragers' camp", ["forager camp"] =   "foragers' camp", ["forager's camp"] = "foragers' camp", ["foragers"] =       "foragers' camp", ["foragerscamps"] =  "foragers' camp", ["forager'scamps"] = "foragers' camp", ["foragers'camps"] = "foragers' camp", ["forager camps"] =  "foragers' camp", ["forager's camps"] = "foragers' camp", ["harvester"] =        "harvesters' camp", ["harvesterscamp"] =   "harvesters' camp", ["harvester'scamp"] =  "harvesters' camp", ["harvesters'camp"] =  "harvesters' camp", ["harvester camp"] =   "harvesters' camp", ["harvester's camp"] = "harvesters' camp", ["harvesters"] =       "harvesters' camp", ["harvesterscamps"] =  "harvesters' camp", ["harvester'scamps"] = "harvesters' camp", ["harvesters'camps"] = "harvesters' camp", ["harvester camps"] =  "harvesters' camp", ["harvester's camps"] = "harvesters' camp", ["herbalist"] =        "herbalists' camp", ["herbalistscamp"] =   "herbalists' camp", ["herbalist'scamp"] =  "herbalists' camp", ["herbalists'camp"] =  "herbalists' camp", ["herbalist camp"] =   "herbalists' camp", ["herbalist's camp"] = "herbalists' camp", ["herbalists"] =       "herbalists' camp", ["herbalistscamps"] =  "herbalists' camp", ["herbalist'scamps"] = "herbalists' camp", ["herbalists'camps"] = "herbalists' camp", ["herbalist camps"] =  "herbalists' camp", ["herbalist's camps"] = "herbalists' camp", ["stonecutter"] =        "stonecutters' camp", ["stonecutterscamp"] =   "stonecutters' camp", ["stonecutter'scamp"] =  "stonecutters' camp", ["stonecutters'camp"] =  "stonecutters' camp", ["stonecutter camp"] =   "stonecutters' camp", ["stonecutter's camp"] = "stonecutters' camp", ["stonecutters"] =       "stonecutters' camp", ["stonecutterscamps"] =  "stonecutters' camp", ["stonecutter'scamps"] = "stonecutters' camp", ["stonecutters'camps"] = "stonecutters' camp", ["stonecutter camps"] =  "stonecutters' camp", ["stonecutter's camps"] = "stonecutters' camp", ["trapper"] =        "trappers' camp", ["trapperscamp"] =   "trappers' camp", ["trapper'scamp"] =  "trappers' camp", ["trappers'camp"] =  "trappers' camp", ["trapper camp"] =   "trappers' camp", ["trapper's camp"] = "trappers' camp", ["trappers"] =       "trappers' camp", ["trapperscamps"] =  "trappers' camp", ["trapper'scamps"] = "trappers' camp", ["trappers'camps"] = "trappers' camp", ["trapper camps"] =  "trappers' camp", ["trapper's camps"] = "trappers' camp", ["woodcutter"] =        "woodcutters' camp", ["woodcutterscamp"] =   "woodcutters' camp", ["woodcutter'scamp"] =  "woodcutters' camp", ["woodcutters'camp"] =  "woodcutters' camp", ["woodcutter camp"] =   "woodcutters' camp", ["woodcutter's camp"] = "woodcutters' camp", ["woodcutters"] =       "woodcutters' camp", ["woodcutterscamps"] =  "woodcutters' camp", ["woodcutter'scamps"] = "woodcutters' camp", ["woodcutters'camps"] = "woodcutters' camp", ["woodcutter camps"] =  "woodcutters' camp", ["woodcutter's camps"] = "woodcutters' camp", -- Farms ["field"] =      "farm field", ["fields"] =     "farm field", ["farmfield"] =  "farm field", ["farmfields"] = "farm field", ["farm fields"] = "farm field", ["greenhouses"] = "greenhouse", ["green house"] = "greenhouse", ["green houses"] = "greenhouse", ["herbgarden"] =  "herb garden", ["herbgardens"] = "herb garden", ["herb gardens"] = "herb garden", ["plantations"] = "plantation", ["farm"] =       "small farm", ["farms"] =      "small farm", ["smallfarm"] =  "small farm", ["smallfarms"] = "small farm", ["small farms"] = "small farm", -- Food Production ["baker"] =   "bakery", ["bakers"] =  "bakery", ["bakeries"] = "bakery", ["butchers"] = "butcher", ["celler"] = "cellar", ["cellers"] = "cellar", ["cellars"] = "cellar", ["cookhouses"] = "cookhouse", ["cook house"] = "cookhouse", ["cook houses"] = "cookhouse", ["fieldkitchen"] = "field kitchen", ["fieldkitchens"] = "field kitchen", ["field kitchens"] = "field kitchen", ["granaries"] = "granary", ["grills"] = "grill", ["ranches"] = "ranch", ["smokehouses"] = "smokehouse", ["smoke house"] = "smokehouse", ["smoke housea"] = "smokehouse", -- Housing ["house"] = "shelter", ["houses"] = "shelter", ["bighouse"] =   "big shelter", ["bighouses"] =  "big shelter", ["bigshelter"] = "big shelter", ["bigshelters"] = "big shelter", ["humanhouse"] =    "human house", ["humanhouses"] =   "human house", ["human'shouse"] =  "human house", ["humans'house"] =  "human house", ["human houses"] =  "human house", ["human's house"] = "human house", ["humans' house"] = "human house", ["human's houses"] = "human house", ["humans' houses"] = "human house", ["beaverhouse"] =    "beaver house", ["beaverhouses"] =   "beaver house", ["beaver'shouse"] =  "beaver house", ["beavers'house"] =  "beaver house", ["beaver'shouses"] = "beaver house", ["beavers'houses"] = "beaver house", ["beaver houses"] =  "beaver house", ["beaver's houses"] = "beaver house", ["beavers' houses"] = "beaver house", ["lizardhouse"] =    "lizard house", ["lizardhouses"] =   "lizard house", ["lizard'shouse"] =  "lizard house", ["lizards'house"] =  "lizard house", ["lizard'shouses"] = "lizard house", ["lizards'houses"] = "lizard house", ["lizard houses"] =  "lizard house", ["lizard's houses"] = "lizard house", ["lizards' houses"] = "lizard house", ["harpyhouse"] =     "harpy house", ["harpyhouses"] =    "harpy house", ["harpy'shouse"] =   "harpy house", ["harpys'house"] =   "harpy house", ["harpy'shouses"] =  "harpy house", ["harpys'houses"] =  "harpy house", ["harpy houses"] =   "harpy house", ["harpy's houses"] = "harpy house", ["harpys' houses"] = "harpy house", ["harpieshouse"] =   "harpy house", ["harpieshouses"] =  "harpy house", ["harpies'house"] =  "harpy house", ["harpies houses"] = "harpy house", ["harpies' houses"] = "harpy house", -- Industry ["crudeworkstation"] = "crude workstation", ["crudeworkstations"] = "crude workstation", ["crude workstations"] = "crude workstation", ["makeshiftpost"] = "makeshift post", ["makeshiftposts"] = "makeshift post", ["makeshift posts"] = "makeshift post", ["advancedraincollector"] = "advanced rain collector", ["advancedraincollectors"] = "advanced rain collector", ["advanced rain collectors"] = "advanced rain collector", ["alchemist"] =       "alchemist's hut", ["alchemists"] =      "alchemist's hut", ["alchemisthut"] =    "alchemist's hut", ["alchemisthuts"] =   "alchemist's hut", ["alchemistshut"] =   "alchemist's hut", ["alchemistshuts"] =  "alchemist's hut", ["alchemist'shut"] =  "alchemist's hut", ["alchemist'shuts"] = "alchemist's hut", ["alchemists'hut"] =  "alchemist's hut", ["alchemists'huts"] = "alchemist's hut", ["alchemist hut"] =   "alchemist's hut", ["alchemist huts"] =  "alchemist's hut", ["alchemists hut"] =  "alchemist's hut", ["alchemists huts"] = "alchemist's hut", ["alchemists' hut"] = "alchemist's hut", ["alchemists' huts"] = "alchemist's hut", ["apothacary"] = "apothecary", ["apothecaries"] = "apothecary", ["artisans"] = "artisan", ["brewer"] =   "brewery", ["brewers"] =  "brewery", ["breweries"] = "brewery", ["brickoven"] = "brick oven", ["brickovens"] = "brick oven", ["brick ovens"] = "brick oven", ["brickyards"] = "brickyard", ["brick yard"] = "brickyard", ["brick yards"] = "brickyard", ["carpenters"] = "carpenter", ["clothiers"] = "clothier", ["cooper"] =    "cooperage", ["coopers"] =   "cooperage", ["cooperages"] = "cooperage", ["druid"] =       "druid's hut", ["druids"] =      "druid's hut", ["druidhut"] =    "druid's hut", ["druidhuts"] =   "druid's hut", ["druid'shut"] =  "druid's hut", ["druid'shuts"] = "druid's hut", ["druids'hut"] =  "druid's hut", ["druids'huts"] = "druid's hut", ["druid hut"] =   "druid's hut", ["druid huts"] =  "druid's hut", ["druids' hut"] = "druid's hut", ["druids' huts"] = "druid's hut", ["druid's huts"] = "druid's hut", ["flawlessbrewery"] = "flawless brewery", ["flawlessbreweries"] = "flawless brewery", ["flawless breweries"] = "flawless brewery", ["flawlessrainmill"] = "flawless rain mill", ["flawlessrainmills"] = "flawless rain mill", ["flawless rainmill"] = "flawless rain mill", ["flawless rainmills"] = "flawless rain mill", ["flawless rain mills"] = "flawless rain mill", ["furnaces"] = "furnace", ["kilns"] = "kiln", ["leatherworkers"] = "leatherworker", ["leather worker"] = "leatherworker", ["leather workers"] = "leatherworker", ["lumbermill"] =  "lumber mill", ["lumbermills"] = "lumber mill", ["lumber mills"] = "lumber mill", ["mines"] = "mine", ["presses"] = "press", ["provisioners"] = "provisioner", ["raincollector"] = "rain collector", ["raincollectors"] = "rain collector", ["rain collectors"] = "rain collector", ["rainmill"] =  "rain mill", ["rainmills"] = "rain mill", ["rain mills"] = "rain mill", ["scribes"] = "scribe", ["smelters"] =  "smelter", ["smeltery"] =  "smelter", ["smelteries"] = "smelter", ["tool shop"] = "toolshop", ["weavers"] = "weaver", -- City buildings ["archaeologyoffice"] =     "archaeologist's office", ["archeologyoffice"] =      "archaeologist's office", ["archaeologistoffice"] =   "archaeologist's office", ["archeologistoffice"] =    "archaeologist's office", ["archaeologistsoffice"] =  "archaeologist's office", ["archeologistsoffice"] =   "archaeologist's office", ["archaeologist'soffice"] = "archaeologist's office", ["archeologist'soffice"] =  "archaeologist's office", ["archeologists'office"] =  "archaeologist's office", ["archaeology office"] =    "archaeologist's office", ["archeology office"] =     "archaeologist's office", ["archaeologist office"] =  "archaeologist's office", ["archeologist office"] =   "archaeologist's office", ["archaeologists office"] = "archaeologist's office", ["archeologists office"] =  "archaeologist's office", ["archeologist's office"] = "archaeologist's office", ["archaeologists' office"] = "archaeologist's office", ["archeologists' office"] = "archaeologist's office", ["smallhearth"] =  "small hearth", ["smallhearths"] = "small hearth", ["small hearths"] = "small hearth", ["warehouses"] = "warehouse", ["ware house"] = "warehouse", ["ware houses"] = "warehouse", ["traderpost"] =  "trading post", ["traderposts"] = "trading post", ["trader posts"] = "trading post", ["tradingpost"] =  "trading post", ["tradingposts"] = "trading post", ["trading posts"] = "trading post", ["blightpost"] =  "blight post", ["blightposts"] = "blight post", ["blight posts"] = "blight post", ["hydrants"] = "hydrant", ["forsakenaltar"] =   "forsaken altar", ["forsakenalter"] =   "forsaken altar", ["foresakenaltar"] =  "forsaken altar", ["foresakenalter"] =  "forsaken altar", ["forsakenaltars"] =  "forsaken altar", ["forsakenalters"] =  "forsaken altar", ["foresakenaltars"] = "forsaken altar", ["foresakenalters"] = "forsaken altar", ["forsaken altars"] = "forsaken altar", ["forsaken alters"] = "forsaken altar", ["foresaken altars"] = "forsaken altar", ["foresaken alters"] = "forsaken altar", -- Service Buildings ["bath"] =       "bath house", ["baths"] =      "bath house", ["bathhouse"] =  "bath house", ["bathhouses"] = "bath house", ["bath houses"] = "bath house", ["clan"] =      "clan hall", ["clans"] =     "clan hall", ["clanhall"] =  "clan hall", ["clanhalls"] = "clan hall", ["clan halls"] = "clan hall", ["explorer"] =         "explorers' lodge", ["explorers"] =        "explorers' lodge", ["explorerlodge"] =    "explorers' lodge", ["explorerslodge"] =   "explorers' lodge", ["explorerlodges"] =   "explorers' lodge", ["explorerslodges"] =  "explorers' lodge", ["explorers'lodges"] = "explorers' lodge", ["explorer'slodges"] = "explorers' lodge", ["explorer lodge"] =   "explorers' lodge", ["explorers lodge"] =  "explorers' lodge", ["explorer lodges"] =  "explorers' lodge", ["explorers lodges"] = "explorers' lodge", ["explorer's lodges"] = "explorers' lodge", ["guild"] =       "guild house", ["guilds"] =      "guild house", ["guildhouse"] =  "guild house", ["guildhouses"] = "guild house", ["guild houses"] = "guild house", ["monestary"] = "monastery", ["monastary"] = "monastery", ["monestery"] = "monastery", ["monestaries"] = "monastery", ["monastaries"] = "monastery", ["monesteries"] = "monastery", ["taverns"] = "tavern", ["temples"] = "temple" } -- the end of the huge tBuildingSimilarities -- If nothing is found, the result of the lookup will be nil, so just -- return whatever was passed in as the argument (now lowercase). we can -- assume that the input argument is fine and another function will worry -- about whether it's valid. return tBuildingSimilarities[buildingName] or buildingName end

--- -- Normalizes a resource name for use as the key in other lookup tables. -- -- This function at least makes the argument lowercase, since keys are -- lowercase to reduce the number of similarities to normalize. -- @param resourceName the in-game name -- @return a normalized name for use as a key function Utility.normalizeResourceName(resourceName) -- no matter what, we want to return the lowercase version resourceName = string.lower(resourceName) -- No other functions should have this lookup table, so it's defined -- locally to this function. The keys are the possible ways the name could -- be written. The values are the normalized string that are used as keys. local tResourceSimilarities = { -- Raw Food ["berry"] = "berries", ["egg"] = "eggs", ["insect"] = "insects", ["meats"] = "meat", ["mushroom"] = "mushrooms", ["root"] = "roots", ["vegetable"] = "vegetables", --Complex Food ["biscuit"] = "biscuits", ["pickledgoods"] = "pickled goods", ["pickledgood"] = "pickled goods", ["pickled good"] = "pickled goods", ["pies"] = "pie", ["skewer"] = "skewers", -- Building Materials ["brick"] = "bricks", ["fabrics"] = "fabric", ["pipe"] = "pipes", ["plank"] = "planks", ["part"] = "parts", ["wildfireessence"] =   "wildfire essence", ["wild fire essence"] = "wildfire essence", ["wildfireessences"] =  "wildfire essence", ["wild fire essences"] = "wildfire essence", -- Consumable items ["coat"] = "coats", ["ales"] = "ale", ["cosmetic"] = "cosmetics", ["incenses"] = "incense", ["insense"] = "incense", ["scroll"] = "scrolls", ["traininggear"] =  "training gear", ["traininggears"] = "training gear", ["training gears"] = "training gear", ["wines"] = "wine", -- Crafting materials ["clays"] = "clay", ["copperore"] =  "copper ore", ["copperores"] = "copper ore", ["copper ores"] = "copper ore", ["crystalizeddew"] =   "crystalized dew", ["crystalizeddews"] =  "crystalized dew", ["crystallizeddew"] =  "crystalized dew", ["crystallizeddews"] = "crystalized dew", ["crystalized dews"] = "crystalized dew", ["crystallized dew"] = "crystalized dew", ["crystallized dews"] = "crystalized dew", ["grains"] = "grain", ["herb"] = "herbs", ["leathers"] = "leather", ["flax"] =        "plant fiber", ["plantfiber"] =  "plant fiber", ["plantfibers"] = "plant fiber", ["plant fibers"] = "plant fiber", ["reed"] = "reeds", ["stones"] = "stone", -- Refined crafting materials ["barrel"] =  "barrels", ["barrell"] = "barrels", ["barrells"] = "barrels", ["copperbar"] =  "copper bars", ["copperbars"] = "copper bars", ["copper bar"] = "copper bars", ["flours"] = "flour", ["pigments"] = "pigment", ["waterskin"] =  "waterskins", ["water skin"] = "waterskins", ["water skins"] = "waterskins", -- Trade goods ["ambers"] = "amber", ["coin"] =  "amber", ["tablet"] =         "ancient tablet", ["tablets"] =        "ancient tablet", ["ancienttablet"] =  "ancient tablet", ["ancienttablets"] = "ancient tablet", ["ancient tablets"] = "ancient tablet", ["buildingmaterial"] =           "pack of building materials", ["buildingmaterials"] =          "pack of building materials", ["building material"] =          "pack of building materials", ["building materials"] =         "pack of building materials", ["packofbuildingmaterial"] =     "pack of building materials", ["packofbuildingmaterials"] =    "pack of building materials", ["pack of building materials"] = "pack of building materials", ["packsofbuildingmaterial"] =    "pack of building materials", ["packsofbuildingmaterials"] =   "pack of building materials", ["packs of building materials"] = "pack of building materials", ["crop"] =         "pack of crops", ["crops"] =        "pack of crops", ["packofcrop"] =   "pack of crops", ["packofcrops"] =  "pack of crops", ["pack of crop"] = "pack of crops", ["packsofcrop"] =  "pack of crops", ["packsofcrops"] = "pack of crops", ["packs of crop"] = "pack of crops", ["luxury"] =              "pack of luxury goods", ["luxuries"] =            "pack of luxury goods", ["luxurygood"] =          "pack of luxury goods", ["luxurygoods"] =         "pack of luxury goods", ["luxury good"] =         "pack of luxury goods", ["luxury goods"] =        "pack of luxury goods", ["packofluxuries"] =      "pack of luxury goods", ["packofluxurygood"] =    "pack of luxury goods", ["packofluxurygoods"] =   "pack of luxury goods", ["pack of luxury good"] = "pack of luxury goods", ["packsofluxuries"] =     "pack of luxury goods", ["packsofluxurygood"] =   "pack of luxury goods", ["packsofluxurygoods"] =  "pack of luxury goods", ["packs of luxury good"] = "pack of luxury goods", ["provision"] =         "pack of provisions", ["provisions"] =        "pack of provisions", ["packofprovision"] =   "pack of provisions", ["packofprovisions"] =  "pack of provisions", ["pack of provision"] = "pack of provisions", ["packsofprovision"] =  "pack of provisions", ["packsofprovisions"] = "pack of provisions", ["packs of provision"] = "pack of provisions", ["tradegood"] =          "pack of trade goods", ["tradegoods"] =         "pack of trade goods", ["trade good"] =         "pack of trade goods", ["trade goods"] =        "pack of trade goods", ["packoftradegood"] =    "pack of trade goods", ["packoftradegoods"] =   "pack of trade goods", ["pack of trade good"] = "pack of trade goods", ["packsoftradegood"] =   "pack of trade goods", ["packsoftradegoods"] =  "pack of trade goods", ["packs of trade good"] = "pack of trade goods", -- Meta resources ["artifact"] =     "artifacts", ["metaartifact"] = "artifacts", ["metaartifacts"] = "artifacts", ["meta artifact"] = "artifacts", ["meta artifacts"] = "artifacts", ["food"] =          "food stockpiles", ["foods"] =         "food stockpiles", ["metafood"] =      "food stockpiles", ["metafoods"] =     "food stockpiles", ["meta food"] =      "food stockpiles", ["meta foods"] =     "food stockpiles", ["foodstockpile"] = "food stockpiles", ["foodstockpiles"] = "food stockpiles", ["food stockpile"] = "food stockpiles", ["meta foodstockpile"] = "food stockpiles", ["meta foodstockpiles"] = "food stockpiles", ["meta food stockpile"] = "food stockpiles", ["meta food stockpiles"] = "food stockpiles", ["machinary"] =    "machinery", ["metamachinery"] = "machinery", ["meta machinery"] = "machinery", -- Fuel & Exploration ["coals"] = "coal", ["oils"] = "oil", ["seamarrow"] =  "sea marrow", ["seamarrows"] = "sea marrow", ["sea marrows"] = "sea marrow", ["woods"] = "wood", ["simpletool"] = "simple tools", ["simpletools"] = "simple tools", ["simple tool"] = "simple tools", ["infusedtool"] = "infused tools", ["infusedtools"] = "infused tools", ["infused tool"] = "infused tools", ["purgingfire"] = "purging fire", ["purgingfires"] = "purging fire", -- Rain ["clearancewater"] = "clearance water", ["clearencewater"] = "clearance water", ["clearence water"] = "clearance water", ["drizzlewater"] = "drizzle water", ["stormwater"] = "storm water" } -- the end of the huge tResourceSimilarities -- If nothing is found, the result of the lookup will be nil, so just -- return whatever was passed in as the argument (now lowercase). we can -- assume that the input argument is fine and another function will worry -- about whether it's valid. return tResourceSimilarities[resourceName] or resourceName end

-- return this class when required into another module. return Utility