<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.earthmc.net/index.php?action=history&amp;feed=atom&amp;title=Module%3AUIText</id>
	<title>Module:UIText - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.earthmc.net/index.php?action=history&amp;feed=atom&amp;title=Module%3AUIText"/>
	<link rel="alternate" type="text/html" href="https://wiki.earthmc.net/index.php?title=Module:UIText&amp;action=history"/>
	<updated>2026-10-27T19:07:00Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.earthmc.net/index.php?title=Module:UIText&amp;diff=234643&amp;oldid=prev</id>
		<title>515797455988850689: Created page with &quot;--Get Required Modules local getArgs = require(&#039;Module:Arguments&#039;).getArgs local loader = require(&#039;Module:Loader&#039;)  local string, table, lu, yesno, stats, statAliases, rarityTier, zones = 	loader.lazy.require(&#039;String&#039;, &#039;Table&#039;, &#039;LibraryUtil&#039;, &#039;Yesno&#039;, &#039;Statname&#039;, &#039;Statname/Aliases&#039;, &#039;RarityTier&#039;, &#039;Zone&#039;)  local potionData, potionAliases, enchantData, enchantAliases, rarityData, rarityAliases, colorAliases, uitextdata, gemstonedata, zoneData = 	loader.lazy.loadData(&#039;Potio...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.earthmc.net/index.php?title=Module:UIText&amp;diff=234643&amp;oldid=prev"/>
		<updated>2023-11-25T08:31:42Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;--Get Required Modules local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs local loader = require(&amp;#039;Module:Loader&amp;#039;)  local string, table, lu, yesno, stats, statAliases, rarityTier, zones = 	loader.lazy.require(&amp;#039;String&amp;#039;, &amp;#039;Table&amp;#039;, &amp;#039;LibraryUtil&amp;#039;, &amp;#039;Yesno&amp;#039;, &amp;#039;Statname&amp;#039;, &amp;#039;Statname/Aliases&amp;#039;, &amp;#039;RarityTier&amp;#039;, &amp;#039;Zone&amp;#039;)  local potionData, potionAliases, enchantData, enchantAliases, rarityData, rarityAliases, colorAliases, uitextdata, gemstonedata, zoneData = 	loader.lazy.loadData(&amp;#039;Potio...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--Get Required Modules&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local loader = require(&amp;#039;Module:Loader&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local string, table, lu, yesno, stats, statAliases, rarityTier, zones =&lt;br /&gt;
	loader.lazy.require(&amp;#039;String&amp;#039;, &amp;#039;Table&amp;#039;, &amp;#039;LibraryUtil&amp;#039;, &amp;#039;Yesno&amp;#039;, &amp;#039;Statname&amp;#039;, &amp;#039;Statname/Aliases&amp;#039;, &amp;#039;RarityTier&amp;#039;, &amp;#039;Zone&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local potionData, potionAliases, enchantData, enchantAliases, rarityData, rarityAliases, colorAliases, uitextdata, gemstonedata, zoneData =&lt;br /&gt;
	loader.lazy.loadData(&amp;#039;Potion/Data&amp;#039;, &amp;#039;Potion/Aliases&amp;#039;, &amp;#039;Enchantment/Data&amp;#039;, &amp;#039;Enchantment/Aliases&amp;#039;, &amp;#039;RarityTier/Data&amp;#039;, &amp;#039;RarityTier/Aliases&amp;#039;, &amp;#039;Color/Aliases&amp;#039;, &amp;#039;UIText/Data&amp;#039;, &amp;#039;Gemstone/Data&amp;#039;, &amp;#039;Zone/Data&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local checkType = lu.checkTypeLight&lt;br /&gt;
&lt;br /&gt;
-- Begin Exports&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
uitextdata = table.deepCopy(uitextdata, true)&lt;br /&gt;
local tooltipFormatting, customFormatting = uitextdata.conversions or {}, uitextdata.custom or {}&lt;br /&gt;
&lt;br /&gt;
for k, v in pairs(gemstonedata.slots) do&lt;br /&gt;
	customFormatting[k] = v.ttColor:gsub(&amp;#039;&amp;amp;&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for k, v in ipairs(potionData) do&lt;br /&gt;
	potionData[k].color = v.color:gsub(&amp;#039;([A-Z])&amp;#039;, function(l)&lt;br /&gt;
		return &amp;#039;_&amp;#039;..l:lower()&lt;br /&gt;
	end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.applyReplacements(val)&lt;br /&gt;
&lt;br /&gt;
	local function replaceStats(statname)&lt;br /&gt;
		local prefix = statname:match(&amp;#039;^([%-%+]?[%.%dkm,]+%%?)%s*&amp;#039;)&lt;br /&gt;
		statname = string.trim((statname:gsub(&amp;#039;^([%-%+]?[%.%dkm,]+%%?)%s*&amp;#039;, &amp;#039;&amp;#039;)))&lt;br /&gt;
		stat = statAliases[statname:lower():gsub(&amp;#039;%s&amp;#039;, &amp;#039; &amp;#039;)]&lt;br /&gt;
		&lt;br /&gt;
		if not stat then&lt;br /&gt;
			return &amp;quot;\\stat{&amp;quot; ..statname.. &amp;quot;}&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return (&amp;#039;&amp;amp;%s%s%s %s&amp;amp;r&amp;#039;):format(tooltipFormatting[stats._getstatdata(stat).color], prefix and prefix..&amp;#039; &amp;#039; or &amp;#039;&amp;#039;, stats._getstatdata(stat).character, string.ucfirst(stat))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function replaceRarities(rarityName)&lt;br /&gt;
		local rarity = rarityAliases[string.trim((rarityName:lower():gsub(&amp;#039;%s&amp;#039;, &amp;#039; &amp;#039;)))]&lt;br /&gt;
		&lt;br /&gt;
		if not rarity then&lt;br /&gt;
			return &amp;quot;\\rarity{&amp;quot; ..rarityName.. &amp;quot;}&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return (&amp;#039;&amp;amp;%s&amp;amp;l%s&amp;amp;r&amp;#039;):format(p.getRarityColor(rarity), rarityData[rarity].name)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function replaceZones(zoneName)&lt;br /&gt;
		local zone = zones._getZoneData(string.trim(zoneName), true)&lt;br /&gt;
		&lt;br /&gt;
		if not zone then&lt;br /&gt;
			return &amp;quot;\\zone{&amp;quot; ..zoneName.. &amp;quot;}&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return (&amp;#039;&amp;amp;%s%s&amp;amp;r&amp;#039;):format(p.getZoneColor(zoneName), zone.name)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function replacePotions(potionName)&lt;br /&gt;
		local oldPot = potion&lt;br /&gt;
		local suffix = potion:match(&amp;#039;%s+([ivxIVX%d]+)&amp;#039;)&lt;br /&gt;
		local potPrefix = potion:match(&amp;#039;%s*[Pp]oti?o?n?&amp;#039;)&lt;br /&gt;
		local potion = potionAliases[string.trim(potionName:gsub(&amp;#039;%s+([ivxIVX%d]+)&amp;#039;, &amp;#039;&amp;#039;):gsub(&amp;#039;%s+[Pp]oti?o?n?&amp;#039;, &amp;#039;&amp;#039;):lower())]&lt;br /&gt;
		local n = string._toNumber(suffix or &amp;#039;&amp;#039;)&lt;br /&gt;
		&lt;br /&gt;
		if not potion or (n and n &amp;gt; potionData[potion].maxLevel) then &lt;br /&gt;
			return &amp;#039;\\potion{&amp;#039;..potionName..&amp;#039;}&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return (&amp;#039;&amp;amp;%s%s%s%s&amp;amp;r&amp;#039;):format(tooltipFormatting[potionData[potion].color:lower()], potion, suffix and &amp;#039; &amp;#039;..string._toRoman(suffix) or &amp;#039;&amp;#039;, potPrefix and &amp;#039; Potion&amp;#039; or &amp;#039;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function replaceEnchants(enchantName)&lt;br /&gt;
		local oldEnch = enchantName&lt;br /&gt;
		local suffix = enchantName:match(&amp;#039;%s+([ivxIVX%d]+)&amp;#039;)&lt;br /&gt;
		local enchant = enchantAliases[string.trim(enchantName:gsub(&amp;#039;%s+[Ee]ncha?n?t?m?e?n?t?s?&amp;#039;, &amp;#039;&amp;#039;):gsub(&amp;#039;%s+([ivxIVX%d]+)&amp;#039;, &amp;#039;&amp;#039;):lower())]&lt;br /&gt;
		local n = string._toNumber(suffix or &amp;#039;&amp;#039;)&lt;br /&gt;
		&lt;br /&gt;
		if not enchant then&lt;br /&gt;
			return &amp;#039;\\enchant{&amp;#039;..enchantName..&amp;#039;}&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		assertFalse(n and n &amp;gt; enchantData[enchant].max, &amp;#039;Enchantment escape &amp;quot;\\enchant{%s}&amp;quot; is out of range (max is %s, got %s)&amp;#039;, 4, oldEnch, enchantData[enchant].max, n)&lt;br /&gt;
		&lt;br /&gt;
		return (&amp;#039;&amp;amp;9%s%s&amp;amp;r&amp;#039;):format(enchant, suffix and &amp;#039; &amp;#039;..string._toRoman(suffix) or &amp;#039;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local ret = (string.unicodeConvert(val)&lt;br /&gt;
		:gsub(&amp;#039;&amp;amp;amp;&amp;#039;, &amp;#039;&amp;amp;&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;\\sta?t?%{(.-)%}&amp;#039;, replaceStats)&lt;br /&gt;
		:gsub(&amp;#039;\\poti?o?n?%{(.-)%}&amp;#039;, replacePotions)&lt;br /&gt;
		:gsub(&amp;#039;\\ra?r?i?t?y?%{(.-)%}&amp;#039;, replaceRarities)&lt;br /&gt;
		:gsub(&amp;#039;\\zo?n?e?%{(.-)%}&amp;#039;, replaceZones)&lt;br /&gt;
		:gsub(&amp;#039;\\ench?a?n?t?m?e?n?t?%{(.-)%}&amp;#039;, replaceEnchants)&lt;br /&gt;
	)&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
-- Temlate: UIText&lt;br /&gt;
-- &lt;br /&gt;
-- Makes making UI&amp;#039;s alot easier&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local val = args[1] or args[&amp;quot;t&amp;quot;] or args[&amp;quot;text&amp;quot;]&lt;br /&gt;
	&lt;br /&gt;
	return string.pcall(p._main, val)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
-- Template: UIText Module access point&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
function p._main(val)&lt;br /&gt;
	checkType(&amp;#039;_main&amp;#039;, 1, val, &amp;#039;string&amp;#039;)&lt;br /&gt;
	return (p.applyReplacements(val)&lt;br /&gt;
		:gsub(&amp;#039;\\&amp;#039;, &amp;#039;&amp;amp;#92;&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;/&amp;#039;, &amp;#039;&amp;amp;#47;&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;\n&amp;#039;, &amp;#039;/&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;\\r&amp;#039;, &amp;#039;\r&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;\\t&amp;#039;, &amp;#039;\t&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;\\v&amp;#039;, &amp;#039;\v&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;\\b&amp;#039;, &amp;#039;\b&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;\\n&amp;#039;, &amp;#039;/&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;&amp;amp;#92;&amp;#039;, &amp;#039;\\\\&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;&amp;amp;#47;&amp;#039;, &amp;#039;\\/&amp;#039;)&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
-- function: getStatColor(statname: string, raw: boolean)&lt;br /&gt;
-- &lt;br /&gt;
-- Gets the In-game color code of a stat (if raw, returns the color instead)&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
function p.getStatColor(statname, raw)&lt;br /&gt;
	checkType(&amp;#039;getStatColor&amp;#039;, 1, statname, { &amp;#039;string&amp;#039; })&lt;br /&gt;
	raw = raw or false&lt;br /&gt;
	&lt;br /&gt;
	if not stats.isStatAlias(statname) then return false end&lt;br /&gt;
	&lt;br /&gt;
	local statColor = stats._getstatdata(statname).color&lt;br /&gt;
	return raw and statColor or tooltipFormatting[statColor]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
-- function: getRarityColor(rarity: string, raw: boolean)&lt;br /&gt;
-- &lt;br /&gt;
-- Gets the In-game color code of a rarity (if raw, returns the color instead)&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
function p.getRarityColor(rarity, raw)&lt;br /&gt;
	checkType(&amp;#039;getRarityColor&amp;#039;, 1, rarity, { &amp;#039;string&amp;#039; })&lt;br /&gt;
	raw = raw or false&lt;br /&gt;
	local rarityColor = rarityTier._getTier(string.trim(rarity:lower()):gsub(&amp;#039;%s&amp;#039;, &amp;#039; &amp;#039;)).color&lt;br /&gt;
	return raw and rarityColor or tooltipFormatting[rarityColor]&lt;br /&gt;
end&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
-- function: getZoneColor(zoneName: string, raw: boolean)&lt;br /&gt;
-- &lt;br /&gt;
-- Gets the In-game color code of a zone (if raw, returns the color instead)&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
function p.getZoneColor(zoneName, raw)&lt;br /&gt;
	checkType(&amp;#039;getZoneColor&amp;#039;, 1, zoneName, { &amp;#039;string&amp;#039; })&lt;br /&gt;
	raw = raw or false&lt;br /&gt;
	local zone = zones._getZoneData(string.trim(zoneName), true)&lt;br /&gt;
	local color = zone and zone.color or nil&lt;br /&gt;
	return color and p.getColorCode(color, raw) or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
-- function: getColorCode(color: string)&lt;br /&gt;
-- &lt;br /&gt;
-- Gets the In-game color code of a color (if raw, returns the color instead)&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
function p.getColorCode(color, raw)&lt;br /&gt;
	checkType(&amp;#039;getColorCode&amp;#039;, 1, color, { &amp;#039;string&amp;#039; })&lt;br /&gt;
	raw = raw or false&lt;br /&gt;
	local color = colorAliases[string.trim(color:lower()):gsub(&amp;#039;%s&amp;#039;, &amp;#039;_&amp;#039;)]&lt;br /&gt;
	return raw and color or tooltipFormatting[color]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
-- function: getFormatting(color: string, text: string, ampersand: boolean)&lt;br /&gt;
-- &lt;br /&gt;
-- Gets the In-game tooltip formatting&lt;br /&gt;
-- (If there is text, will wrap with &amp;amp;..color..text, this can be overridden)&lt;br /&gt;
-- Also works for stats, rarities and colors&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
function p.getFormatting(color, text, ampersand)&lt;br /&gt;
	checkType(&amp;#039;getFormatting&amp;#039;, 1, color, { &amp;#039;string&amp;#039;, &amp;#039;table&amp;#039; })&lt;br /&gt;
	checkType(&amp;#039;getFormatting&amp;#039;, 2, text, { &amp;#039;string&amp;#039;, &amp;#039;table&amp;#039;, &amp;#039;number&amp;#039; }, true)&lt;br /&gt;
	amp = ampersand or (text and true or false)&lt;br /&gt;
	&lt;br /&gt;
	local code&lt;br /&gt;
	color = string.trim(string.lower(color))&lt;br /&gt;
	if color:match(&amp;#039;^&amp;amp;[0-9a-z]$&amp;#039;) then&lt;br /&gt;
		code = color:match(&amp;#039;^&amp;amp;([0-9a-z])$&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		code = tooltipFormatting[string.gsub(color, &amp;#039;%s&amp;#039;, &amp;#039;_&amp;#039;)] or customFormatting[color] or p.getStatColor(color) or p.getRarityColor(color) or p.getZoneColor(color)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return (amp and code and &amp;#039;&amp;amp;&amp;#039; or &amp;#039;&amp;#039;)..(code or color)..(text or &amp;#039;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
-- function: tooltipBreak(line: string, maxchar: number)&lt;br /&gt;
-- &lt;br /&gt;
-- returns a list of strings that is broken down with maxchar set as the max.&lt;br /&gt;
-- line length, with formatting strings *included*&lt;br /&gt;
-- (since this is how collection UIs are handled)&lt;br /&gt;
---------------------------------------------------------------------------------&lt;br /&gt;
function p.tooltipBreak(line, maxchar)&lt;br /&gt;
	local t = { line }&lt;br /&gt;
	while true do&lt;br /&gt;
		local lastline = t[#t]&lt;br /&gt;
		if (#(t[#t]) &amp;lt;= maxchar) then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		-- choose break point&lt;br /&gt;
		local pos = lastline:sub(1, maxchar + 1):find(&amp;#039; %S*$&amp;#039;)&lt;br /&gt;
		if not pos then&lt;br /&gt;
			pos = lastline:find(&amp;#039; &amp;#039;);&lt;br /&gt;
		end&lt;br /&gt;
		if not pos then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		-- find preceding color codes&lt;br /&gt;
		local colcode = &amp;#039;&amp;#039;&lt;br /&gt;
		local temp = lastline:sub(1, pos):gsub(&amp;#039;\\\\&amp;#039;, &amp;#039;&amp;#039;):gsub(&amp;#039;\\&amp;amp;&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
		local matches = {}&lt;br /&gt;
		for v in string.gmatch(temp, &amp;#039;&amp;amp;[0-9a-fk-o]&amp;#039;) do&lt;br /&gt;
			table.push(matches, v)&lt;br /&gt;
		end&lt;br /&gt;
		colcode = table.concat(matches):gsub(&amp;#039;.-(&amp;amp;[0-9a-f][^0-9a-f]*)$&amp;#039;, &amp;#039;%1&amp;#039;)&lt;br /&gt;
		-- split line at pos&lt;br /&gt;
		t[#t] = lastline:sub(1, pos - 1)&lt;br /&gt;
		t[#t + 1] = colcode .. lastline:sub(pos + 1, #lastline)&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Finish Module/Exports&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>515797455988850689</name></author>
	</entry>
</feed>