Still landing on the old Fandom wiki? Install the HighSpell Wiki Redirector browser extension to automatically redirect all highspell.fandom.com links to highspell.wiki. Works on both Firefox and Chrome, and is open-source. → Learn more and install it now!

Module:RarityHandler: Difference between revisions

From HighSpell Wiki
Jump to navigation Jump to search
No edit summary
Undo revision 4483 by Ryan (talk)
Tag: Undo
 
(3 intermediate revisions by the same user not shown)
Line 1: Line 1:
local p = {}
local p = {}


-- Clean: trim and strip leading ~
-- Clean up the rarity string: strip ~, commas, trim
local function clean(rarity)
local function clean(rarity)
    if not rarity or type(rarity) ~= "string" then return nil end
if not rarity or type(rarity) ~= "string" then return nil end
    rarity = mw.text.trim(rarity)
rarity = mw.text.trim(rarity)
    -- Strip leading ~
rarity = rarity:gsub("^~", "") -- remove ~
    if rarity:sub(1, 1) == "~" then
rarity = rarity:gsub(",", "") -- remove commas
        rarity = rarity:sub(2)
return rarity
    end
    -- Strip commas
    rarity = rarity:gsub(",", "")
    return rarity
end
end


function p.getSortValue(frame)
function p.getSortValue(frame)
    local raw = frame.args[1]
local raw = frame.args[1]
    if not raw or type(raw) ~= "string" then
if not raw or type(raw) ~= "string" then return 999999999 end
        return 999999999
    end


    local rarity = clean(raw)
local rarity = clean(raw)
    if not rarity then return 999999999 end
if not rarity then return 999999999 end


    local lowered = rarity:lower()
local lowered = rarity:lower()


    -- Handle special values
if lowered == "1" or lowered == "always" then
    if lowered == "1" or lowered == "always" then
return 1
        return 1
elseif lowered == "rare" then
    elseif lowered == "rare" then
return 999999998
        return 999999998
elseif lowered == "never" then
    elseif lowered == "never" then
return 0
        return 0
end
    end


    -- Match and convert fractional chance like "1/2.5", "1/10000"
-- Match 1/X, return raw number (not string)
    local num = lowered:match("^1/(%d+%.?%d*)$")
local numStr = lowered:match("^1/(%d+%.?%d*)$")
    if num then
if numStr then
        local n = tonumber(num)
local num = tonumber(numStr)
        if n then
if num then return math.floor(num) end
            return math.floor(n)
end
        end
    end


    return 999999999
return 999999999
end
end


-- For class logic: cleaned string, lowercase
-- For logic styling
function p.getCleanValue(frame)
function p.getCleanValue(frame)
    local rarity = clean(frame.args[1])
local rarity = clean(frame.args[1])
    if not rarity then return "Unknown" end
if not rarity then return "Unknown" end
 
if rarity == "1" then return "Always" end
    if rarity == "1" then
return rarity
        return "Always"
    end
 
    return rarity
end
end


-- For display
-- For display
function p.normalizeDisplay(frame)
function p.normalizeDisplay(frame)
    local original = frame.args[1]
local original = frame.args[1]
    if not original or type(original) ~= "string" then return "Unknown" end
if not original or type(original) ~= "string" then return "Unknown" end
 
local trimmed = mw.text.trim(original)
    local trimmed = mw.text.trim(original)
local hasTilde = trimmed:sub(1, 1) == "~"
    local hasTilde = trimmed:sub(1, 1) == "~"
local cleaned = hasTilde and trimmed:sub(2) or trimmed
    local cleaned = hasTilde and trimmed:sub(2) or trimmed


    if cleaned == "1" then
if cleaned == "1" then return "Always" end
        return "Always"
    end


    -- Format numbers like 1/10000 → 1/10,000
local prefix, num = cleaned:match("^(1/)(%d+%.?%d*)$")
    local prefix, num = cleaned:match("^(1/)(%d+%.?%d*)$")
if prefix and num then
    if prefix and num then
local withCommas = mw.language.getContentLanguage():formatNum(tonumber(num))
        local withCommas = mw.language.getContentLanguage():formatNum(tonumber(num))
return (hasTilde and "~" or "") .. prefix .. withCommas
        return (hasTilde and "~" or "") .. prefix .. withCommas
end
    end


    return hasTilde and ("~" .. cleaned) or cleaned
return hasTilde and "~" .. cleaned or cleaned
end
end


return p
return p

Latest revision as of 14:01, 19 May 2025

Documentation for this module may be created at Module:RarityHandler/doc

local p = {}

-- Clean up the rarity string: strip ~, commas, trim
local function clean(rarity)
	if not rarity or type(rarity) ~= "string" then return nil end
	rarity = mw.text.trim(rarity)
	rarity = rarity:gsub("^~", "") -- remove ~
	rarity = rarity:gsub(",", "") -- remove commas
	return rarity
end

function p.getSortValue(frame)
	local raw = frame.args[1]
	if not raw or type(raw) ~= "string" then return 999999999 end

	local rarity = clean(raw)
	if not rarity then return 999999999 end

	local lowered = rarity:lower()

	if lowered == "1" or lowered == "always" then
		return 1
	elseif lowered == "rare" then
		return 999999998
	elseif lowered == "never" then
		return 0
	end

	-- Match 1/X, return raw number (not string)
	local numStr = lowered:match("^1/(%d+%.?%d*)$")
	if numStr then
		local num = tonumber(numStr)
		if num then return math.floor(num) end
	end

	return 999999999
end

-- For logic styling
function p.getCleanValue(frame)
	local rarity = clean(frame.args[1])
	if not rarity then return "Unknown" end
	if rarity == "1" then return "Always" end
	return rarity
end

-- For display
function p.normalizeDisplay(frame)
	local original = frame.args[1]
	if not original or type(original) ~= "string" then return "Unknown" end
	local trimmed = mw.text.trim(original)
	local hasTilde = trimmed:sub(1, 1) == "~"
	local cleaned = hasTilde and trimmed:sub(2) or trimmed

	if cleaned == "1" then return "Always" end

	local prefix, num = cleaned:match("^(1/)(%d+%.?%d*)$")
	if prefix and num then
		local withCommas = mw.language.getContentLanguage():formatNum(tonumber(num))
		return (hasTilde and "~" or "") .. prefix .. withCommas
	end

	return hasTilde and "~" .. cleaned or cleaned
end

return p