<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.play.eco/en/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Linskyter</id>
	<title>Eco - English Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.play.eco/en/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Linskyter"/>
	<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/Special:Contributions/Linskyter"/>
	<updated>2026-06-25T04:39:24Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=12816</id>
		<title>Module:IconUtils</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Module:IconUtils&amp;diff=12816"/>
		<updated>2024-09-05T09:18:36Z</updated>

		<summary type="html">&lt;p&gt;Linskyter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(param)&lt;br /&gt;
    local Utils = require(&#039;Module:Utils&#039;)&lt;br /&gt;
&lt;br /&gt;
    local Icon = &#039;&#039;&lt;br /&gt;
    local IconStyle = &#039;&#039;&lt;br /&gt;
    local IconSize = &#039;&#039;&lt;br /&gt;
    local IconLink = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    local args = Utils.normalise(param)&lt;br /&gt;
&lt;br /&gt;
    if args.name == nil or args.name == &#039;&#039; then return &#039;Module:IconUtils \&#039;name\&#039; must be specified.&#039; end&lt;br /&gt;
&lt;br /&gt;
    local itemData = mw.loadData(&amp;quot;Module:ItemData&amp;quot;)&lt;br /&gt;
    local itemTable = itemData.items[args.name]&lt;br /&gt;
    if itemTable == nil then itemTable = itemData.tags[args.name] end&lt;br /&gt;
    if itemTable == nil then return args.name .. &#039; could not be found &#039; end&lt;br /&gt;
    local ItemEN&lt;br /&gt;
    if itemTable.untranslated ~= nil then ItemEN = itemTable.untranslated else ItemEN = args.name end&lt;br /&gt;
    local IconName = string.gsub(ItemEN, &#039; &#039;, &#039;&#039;) .. &#039;Item&#039;&lt;br /&gt;
    if IconName == nil then&lt;br /&gt;
    	IconName = ItemEN&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    Icon = Utils.checkImage(IconName)&lt;br /&gt;
&lt;br /&gt;
    if args.size == nil or args.size == &#039;&#039; then IconSize = 28 else IconSize = args.size end&lt;br /&gt;
    if args.style == nil or args.style == &#039;&#039; then IconStyle = &#039;1&#039; else IconStyle = args.style end&lt;br /&gt;
    if args.link == nil or args.link == &#039;&#039; then IconLink = &#039;&#039; else IconLink = &#039;[[&#039; .. args.link .. &#039;]]&#039; end   &lt;br /&gt;
    if args.link == &#039;1&#039; then IconLink = &#039;[[&#039; .. args.name .. &#039;]]&#039; end&lt;br /&gt;
    if IconLink == &#039;&#039; then IconTextLine = &#039;  &#039; .. args.name IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. args.name else IconTextLine = &#039;  &#039; .. IconLink IconTextBr = &#039;&amp;lt;br&amp;gt;&#039; .. IconLink end&lt;br /&gt;
&lt;br /&gt;
    if IconStyle == &#039;1&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; end&lt;br /&gt;
    if IconStyle == &#039;2&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextLine end&lt;br /&gt;
    if IconStyle == &#039;3&#039; then return &#039;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr end&lt;br /&gt;
    if IconStyle == &#039;4&#039; then return &#039;&amp;lt;div class=&amp;quot;IconFrame&amp;quot;&amp;gt;[[file:&#039;.. Icon ..&#039;|&#039;.. IconSize ..&#039;px|link=&#039;.. IconLink ..&#039;]]&#039; .. IconTextBr .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Linskyter</name></author>
	</entry>
	<entry>
		<id>https://wiki.play.eco/en/index.php?title=Module:Utils&amp;diff=12815</id>
		<title>Module:Utils</title>
		<link rel="alternate" type="text/html" href="https://wiki.play.eco/en/index.php?title=Module:Utils&amp;diff=12815"/>
		<updated>2024-09-05T09:16:51Z</updated>

		<summary type="html">&lt;p&gt;Linskyter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
--- Trims and parses the args into a table, then returns the table&lt;br /&gt;
function p.normalise(args)&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		v = mw.text.trim(tostring(v))&lt;br /&gt;
		if v ~= &#039;&#039; then&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Trims and parses the args into a table, then returns the table&lt;br /&gt;
-- @author User:Avaren&lt;br /&gt;
function p.normaliseArgs(frame)&lt;br /&gt;
	local origArgs = frame:getParent().args&lt;br /&gt;
	local args = {}&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs(origArgs) do&lt;br /&gt;
		v = mw.text.trim(tostring(v))&lt;br /&gt;
		if v ~= &#039;&#039; then&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Get path to icon file.&lt;br /&gt;
-- @author User:Avaren&lt;br /&gt;
function p.checkImage(name, too_expensive)&lt;br /&gt;
	local icon = name:gsub(&#039;%s+&#039;, &#039;&#039;) .. &#039;_Icon.png&#039;&lt;br /&gt;
	if too_expensive then&lt;br /&gt;
		return icon&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if mw.title.makeTitle(&#039;File&#039;, icon).file.exists then&lt;br /&gt;
		return icon&lt;br /&gt;
	else&lt;br /&gt;
		return &#039;NoIcon.png&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.itemId(name)&lt;br /&gt;
	return name:gsub(&#039;%s+&#039;, &#039;&#039;) .. &#039;Item&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Check if &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; is in given &amp;lt;code&amp;gt;array&amp;lt;/code&amp;gt;.&lt;br /&gt;
-- @param item Item to look for&lt;br /&gt;
-- @param #table array Table to check&lt;br /&gt;
-- @return #bool &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; is in &amp;lt;code&amp;gt;array&amp;lt;/code&amp;gt;&lt;br /&gt;
-- @author User:Avaren&lt;br /&gt;
local function in_array(item, array)&lt;br /&gt;
	-- Should only use on short arrays&lt;br /&gt;
	local set = {}&lt;br /&gt;
	for _, l in ipairs(array) do&lt;br /&gt;
		set[l] = true&lt;br /&gt;
	end&lt;br /&gt;
	return set[item] ~= nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Calculate the length of a table by iterating over every item in it.&lt;br /&gt;
--&lt;br /&gt;
-- &amp;lt;code&amp;gt;mw.LoadData&amp;lt;/code&amp;gt; prevents &amp;lt;code&amp;gt;#tbl&amp;lt;/code&amp;gt; from working correctly.&lt;br /&gt;
-- @param #table tbl Table to calculate the length of&lt;br /&gt;
-- @return #number Length of the table.&lt;br /&gt;
-- @author User:Avaren&lt;br /&gt;
function p.tableLen(tbl)&lt;br /&gt;
	local count = 0&lt;br /&gt;
	for _, v in ipairs(tbl) do&lt;br /&gt;
		if v == nil then&lt;br /&gt;
			return count&lt;br /&gt;
		end&lt;br /&gt;
		count = count + 1&lt;br /&gt;
	end&lt;br /&gt;
	return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Check if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; and return it or if it is &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; fall back to &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;.&lt;br /&gt;
-- @param value Value to check&lt;br /&gt;
-- @param default Value to fall back to&lt;br /&gt;
-- @return &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; if it is not &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;&lt;br /&gt;
-- @return &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;&lt;br /&gt;
-- @author User:Demian&lt;br /&gt;
-- @see valueOrDash&lt;br /&gt;
-- @see formatNilToYesNo&lt;br /&gt;
-- @see formatBoolToYesNo&lt;br /&gt;
function p.valueOrDefault(value, default)&lt;br /&gt;
	return nil == value and default or value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Check if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; and return it or if it is &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; fall back to the em-dash (—).&lt;br /&gt;
--&lt;br /&gt;
-- The em-dash (—) is commonly used represent a missing, not applicable (N/A), or a negative (&amp;quot;no&amp;quot;) value with just a single character.&lt;br /&gt;
-- @param value Value to check&lt;br /&gt;
-- @return &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; if it is not &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;&lt;br /&gt;
-- @return #string &amp;quot;—&amp;quot; if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;&lt;br /&gt;
-- @author User:Demian&lt;br /&gt;
-- @see valueOrDefault&lt;br /&gt;
function p.valueOrDash(value)&lt;br /&gt;
	return nil == value and &amp;quot;—&amp;quot; or value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Check if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; and return &amp;quot;Yes&amp;quot; or &amp;quot;No&amp;quot;.&lt;br /&gt;
-- @param value Value to check&lt;br /&gt;
-- @return #string &amp;quot;Yes&amp;quot; if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is not &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;&lt;br /&gt;
-- @return #string &amp;quot;No&amp;quot; if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;&lt;br /&gt;
-- @author User:Demian&lt;br /&gt;
-- @see valueOrDefault&lt;br /&gt;
-- @usage formatNilToYesNo(&amp;quot;Hello&amp;quot;) == &amp;quot;Yes&amp;quot;&lt;br /&gt;
-- @usage formatNilToYesNo(nil) == &amp;quot;No&amp;quot;&lt;br /&gt;
function p.formatNilToYesNo(value)&lt;br /&gt;
	-- TODO: Support i18n.&lt;br /&gt;
	return nil == value and &amp;quot;No&amp;quot; or &amp;quot;Yes&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Check if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; &amp;lt;em&amp;gt;evaluates&amp;lt;/em&amp;gt; as &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; and return &amp;quot;Yes&amp;quot; or &amp;quot;No&amp;quot;.&lt;br /&gt;
-- @param value Value to evaluate. Does not have to be a bool.&lt;br /&gt;
-- @return #string &amp;quot;Yes&amp;quot; if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; evaluates as &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&lt;br /&gt;
-- @return #string &amp;quot;No&amp;quot; if &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; evaluates as &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
-- @author User:Demian&lt;br /&gt;
-- @see valueOrDefault&lt;br /&gt;
-- @usage formatBoolToYesNo(&amp;quot;&amp;quot;) == true&lt;br /&gt;
-- @usage formatBoolToYesNo(123) == true&lt;br /&gt;
-- @usage formatBoolToYesNo(nil) == false&lt;br /&gt;
function p.formatBoolToYesNo(value)&lt;br /&gt;
	-- TODO: Support i18n.&lt;br /&gt;
	return value and &amp;quot;Yes&amp;quot; or &amp;quot;No&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Format the input values into a string representing the range between the values.&lt;br /&gt;
--&lt;br /&gt;
-- Returning an an empty string intended to ease concatenation with other strings.&lt;br /&gt;
-- The en-dash (–) (instead of the hyphen-minus &amp;quot;-&amp;quot;) is the appropriate character to signify a range of values.&lt;br /&gt;
-- @param #number min Minimum value (left side)&lt;br /&gt;
-- @param #number max Maximum value (right side)&lt;br /&gt;
-- @param #number default Default value in case of an error (only value).&lt;br /&gt;
-- @param #string valueFormat Format string used with &amp;lt;code&amp;gt;mw.ustring.format&amp;lt;/code&amp;gt;.&lt;br /&gt;
-- @return #string &amp;quot;&amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt;&amp;quot; if &amp;lt;code&amp;gt;min &amp;lt; max&amp;lt;/code&amp;gt;&lt;br /&gt;
-- @return #string &amp;quot;&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;&amp;quot; formatted with &amp;lt;code&amp;gt;valueFormat&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;min == max&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;min &amp;gt; max&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;default ~= nil&amp;lt;/code&amp;gt;&lt;br /&gt;
-- @return #string &amp;quot;&amp;quot; (empty string) if either &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt; &amp;lt;strong&amp;gt;or&amp;lt;/strong&amp;gt; &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; do not convert to a numerical value&lt;br /&gt;
-- @return #nil &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;min == max&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;min &amp;gt; max&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;default == nil&amp;lt;/code&amp;gt;&lt;br /&gt;
-- @author User:Demian&lt;br /&gt;
function p.toRangeString(min, max, default, valueFormat)&lt;br /&gt;
	min = tonumber(p.valueOrDefault(min, nil))&lt;br /&gt;
	max = tonumber(p.valueOrDefault(max, nil))&lt;br /&gt;
	default = tonumber(p.valueOrDefault(default, nil))&lt;br /&gt;
&lt;br /&gt;
	if nil ~= min and nil ~= max then&lt;br /&gt;
		if min &amp;lt; max then&lt;br /&gt;
			return mw.ustring.format(mw.ustring.format(&amp;quot;%s–%s&amp;quot;, valueFormat, valueFormat), min, max)&lt;br /&gt;
		elseif nil == default then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return mw.ustring.format(valueFormat, default)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Get all keys from &amp;lt;code&amp;gt;tbl&amp;lt;/code&amp;gt; and sort them in alphabetical order.&lt;br /&gt;
-- @param #table tbl Table to get keys from&lt;br /&gt;
-- @return #table Input table keys in alphabetical order.&lt;br /&gt;
-- @author User:Demian&lt;br /&gt;
-- @see getSortedValues&lt;br /&gt;
function p.getSortedKeys(tbl)&lt;br /&gt;
	local sorted = {}&lt;br /&gt;
&lt;br /&gt;
	for key in pairs(tbl) do&lt;br /&gt;
		table.insert(sorted, key)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.sort(sorted)&lt;br /&gt;
&lt;br /&gt;
	return sorted&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Get all values from &amp;lt;code&amp;gt;tbl&amp;lt;/code&amp;gt; and sort them in alphabetical order.&lt;br /&gt;
-- @param #table tbl Table to get values from&lt;br /&gt;
-- @return #table Input table values in alphabetical order.&lt;br /&gt;
-- @author User:Demian&lt;br /&gt;
-- @see getSortedKeys&lt;br /&gt;
function p.getSortedValues(tbl)&lt;br /&gt;
	local sorted = {}&lt;br /&gt;
&lt;br /&gt;
	for _, value in ipairs(tbl) do&lt;br /&gt;
		table.insert(sorted, value)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.sort(sorted)&lt;br /&gt;
&lt;br /&gt;
	return sorted&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Split &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; by the given character.&lt;br /&gt;
-- @param #string str String to split&lt;br /&gt;
-- @param #string separator String that separates values in &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt;. May optionally be surrounded by 1 &amp;lt;em&amp;gt;whitespace&amp;lt;/em&amp;gt; character by default.&lt;br /&gt;
-- @return #table Table of strings that were split from &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt;.&lt;br /&gt;
-- @author User:Demian&lt;br /&gt;
-- @usage splitString(&amp;quot;hello, world&amp;quot;, &amp;quot;,&amp;quot;) == {&amp;quot;hello&amp;quot;, &amp;quot;world&amp;quot;}&lt;br /&gt;
function p.splitString(str, separator)&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
&lt;br /&gt;
	for token in mw.ustring.gmatch(str, mw.ustring.format(&amp;quot;%%s?([^%s]+)%%s?&amp;quot;, separator)) do&lt;br /&gt;
		table.insert(tbl, token)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Sort items in the given list of values &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; separated with &amp;lt;code&amp;gt;separator&amp;lt;/code&amp;gt; and return them as a single string.&lt;br /&gt;
-- @param #string str String with values separated by &amp;lt;code&amp;gt;separator&amp;lt;/code&amp;gt;&lt;br /&gt;
-- @param #string separator String that separates values in &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt;&lt;br /&gt;
-- @param #string joiner String used to join sorted values from &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt;.&lt;br /&gt;
-- @return #string &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; with items sorted in alphabetical order.&lt;br /&gt;
-- @author User:Demian&lt;br /&gt;
-- @usage sortListString(&amp;quot;Dog,Ape, Cat&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;;&amp;quot;) == &amp;quot;Ape;Cat;Dog&amp;quot;&lt;br /&gt;
function p.sortListString(str, separator, joiner)&lt;br /&gt;
	-- Split string by commas.&lt;br /&gt;
	-- Sort items.&lt;br /&gt;
	-- Rejoin into string.&lt;br /&gt;
	return table.concat(p.getSortedValues(p.splitString(str, separator)), joiner)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Check if a page with the title &amp;quot;&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;disambiguationTitle&amp;lt;/code&amp;gt;)&amp;quot; exists in the database and return that page title, otherwise return &amp;quot;&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
--&lt;br /&gt;
-- Use sparingly as this uses a comparatively slow MediaWiki function p.to check if a page exists.&lt;br /&gt;
--&lt;br /&gt;
-- Using this function p.will create a new entry in the &amp;lt;code&amp;gt;Special:WantedPages&amp;lt;/code&amp;gt; list.&lt;br /&gt;
-- Be careful when calling this function p.and do not pass garbage into its parameters so you do not clog up that list.&lt;br /&gt;
-- This is a long-standing issue with MediaWiki that has not yet been solved, and may not be possible to solve without an architectural change to the software.&lt;br /&gt;
-- @param #string name Name of a page.&lt;br /&gt;
-- @param #string disambiguationTitle Disambiguation clarifier in a page title.&lt;br /&gt;
-- @return #string &amp;quot;&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;disambiguationTitle&amp;lt;/code&amp;gt;)&amp;quot;&lt;br /&gt;
-- @return #string &amp;quot;&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
-- @author User:Demian&lt;br /&gt;
function p.getDirectPageName(name, disambiguationTitle)&lt;br /&gt;
	-- Try to get the actual end page instead of the disambiguation page if it exists.&lt;br /&gt;
	-- E.g. Salmon has &amp;quot;Salmon (animal)&amp;quot; and &amp;quot;Salmon (item)&amp;quot; as well as the &amp;quot;Salmon&amp;quot; disambiguation page between these two.&lt;br /&gt;
	local directPage = mw.ustring.format(&amp;quot;%s (%s)&amp;quot;, name, disambiguationTitle)&lt;br /&gt;
	return mw.title.new(directPage).exists and directPage or name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Create a wikilink with [[square brackets]] from parameters.&lt;br /&gt;
-- @param #string pageName The actual name of a page to create a link to&lt;br /&gt;
-- @param #string displayText Text to display as a clickable link instead of the page name. If &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pageName&amp;lt;/code&amp;gt; is displayed instead.&lt;br /&gt;
-- @param #bool twoLineDisplayText Force the &amp;lt;em&amp;gt;last word&amp;lt;/em&amp;gt; of &amp;lt;code&amp;gt;displayText&amp;lt;/code&amp;gt; on the next line&lt;br /&gt;
-- @return #string &amp;quot;[[&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;|&amp;lt;code&amp;gt;displayText&amp;lt;/code&amp;gt;]]&amp;quot; if &amp;lt;code&amp;gt;displayText&amp;lt;/code&amp;gt; is not &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;&lt;br /&gt;
-- @return #string &amp;quot;[[&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;]]&amp;quot; if &amp;lt;code&amp;gt;displayText&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; or the same string as &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;&lt;br /&gt;
-- @author User:Demian&lt;br /&gt;
function p.formatWikilink(pageName, displayText, twoLineDisplayText)&lt;br /&gt;
	local finalDisplayText = p.valueOrDefault(displayText, pageName)&lt;br /&gt;
&lt;br /&gt;
	if twoLineDisplayText then&lt;br /&gt;
		local lastSpaceIdx = mw.ustring.find(finalDisplayText, &amp;quot; [^ ]*$&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		if nil ~= lastSpaceIdx then&lt;br /&gt;
			finalDisplayText = mw.ustring.format(&amp;quot;%s&amp;lt;br&amp;gt;%s&amp;quot;, mw.ustring.sub(finalDisplayText, 0, lastSpaceIdx-1), mw.ustring.sub(finalDisplayText, lastSpaceIdx+1))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if pageName == finalDisplayText then&lt;br /&gt;
		return mw.ustring.format(&amp;quot;[[%s]]&amp;quot;, pageName)&lt;br /&gt;
	else&lt;br /&gt;
		return mw.ustring.format(&amp;quot;[[%s|%s]]&amp;quot;, pageName, finalDisplayText)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Add thousands separator to given number and use custom decimal point.&lt;br /&gt;
--&lt;br /&gt;
-- Extension:NumberFormat is more extensive, but more cumbersome to use and also not installed at the moment.&lt;br /&gt;
-- @param #string number Number to format. Is processed as a string regardless of type.&lt;br /&gt;
-- @param #string thousandsSeparator String to place between each set of 3 digits. Default: &amp;quot; &amp;quot;&lt;br /&gt;
-- @param #string decimalPoint String to place between the whole and fractional part of the number. Default: &amp;quot;.&amp;quot;&lt;br /&gt;
-- @return #string &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; with the specified thousands separator and decimal point.&lt;br /&gt;
-- @return #string &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt; unchanged if it contained 1 or more characters that are &amp;lt;strong&amp;gt;not&amp;lt;/strong&amp;gt; a: digit, one of &amp;quot;.,-&amp;quot;, a space.&lt;br /&gt;
-- @author User:Demian&lt;br /&gt;
-- @usage formatNumber(-1234567.89) = &amp;quot;-1 234 567.89&amp;quot;&lt;br /&gt;
-- @usage formatNumber(&amp;quot;1234567,89&amp;quot;, &amp;quot;.&amp;quot;, &amp;quot;_&amp;quot;) = &amp;quot;1,234,567_89&amp;quot;&lt;br /&gt;
function p.formatNumber(number, thousandsSeparator, decimalPoint)&lt;br /&gt;
	-- Default separator to space.&lt;br /&gt;
	if nil == thousandsSeparator then&lt;br /&gt;
		thousandsSeparator = &amp;quot; &amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Default point to period.&lt;br /&gt;
	if nil == decimalPoint then&lt;br /&gt;
		decimalPoint = &amp;quot;.&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- We&#039;re dealing with formatting a string here.&lt;br /&gt;
	local numberString = tostring(number)&lt;br /&gt;
&lt;br /&gt;
	-- Check if the input number is reasonable.&lt;br /&gt;
	-- Does NOT check for multiple instance of each character.&lt;br /&gt;
	-- E.g. Inputting something like 123-456.789 will lead to incorrect results.&lt;br /&gt;
	-- I can&#039;t handle every edge case: garbage in, garbage out.&lt;br /&gt;
	-- The user has to have some responsibility in inputting reasonable numbers.&lt;br /&gt;
	if mw.ustring.find(numberString, &amp;quot;[^%d%.%-, ]&amp;quot;) then&lt;br /&gt;
		return number&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Split input into parts.&lt;br /&gt;
	-- 1st group: MAY start with a &amp;quot;-&amp;quot;.&lt;br /&gt;
	-- 2nd group: MUST contain 1 or more digits-&lt;br /&gt;
	-- 3rd group: MAY start with with one of &amp;quot;.,&amp;quot;&lt;br /&gt;
	-- 3rd group: MAY have 0 or more digits.&lt;br /&gt;
	local _, _, minus, digits, fraction = mw.ustring.find(tostring(numberString), &amp;quot;(-?)(%d+)([%.,]?%d*)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- Reverse the string of digits.&lt;br /&gt;
	-- Append the thousands separator after (before when reversed again) each set of 3 digits.&lt;br /&gt;
	digits = mw.ustring.gsub(string.reverse(digits), &amp;quot;(%d%d%d)&amp;quot;, mw.ustring.format(&amp;quot;%%1%s&amp;quot;, thousandsSeparator))&lt;br /&gt;
&lt;br /&gt;
	-- Replace the existing decimal separator with the specified one.&lt;br /&gt;
	if &amp;quot;&amp;quot; ~= fraction then&lt;br /&gt;
		fraction = mw.ustring.format(&amp;quot;%s%s&amp;quot;,decimalPoint, mw.ustring.sub(fraction, 2))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Reverse the string of digits back to the original direction.&lt;br /&gt;
	-- If the string digits starts with the thousands separator, remove the separator.&lt;br /&gt;
	-- Add the optional minus in front and the optional fractional part at the back.&lt;br /&gt;
	-- Need to remember to escape the thousandsSeparator, it could be &amp;quot;.&amp;quot; which would translate to &amp;quot;any character&amp;quot;!&lt;br /&gt;
	return mw.ustring.format(&amp;quot;%s%s%s&amp;quot;, minus, mw.ustring.gsub(string.reverse(digits), mw.ustring.format(&amp;quot;^%%s&amp;quot;, thousandsSeparator), &amp;quot;&amp;quot;), fraction)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Check if the string is empty or &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt;.&lt;br /&gt;
-- @param #string str String to check&lt;br /&gt;
-- @return #bool &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; if &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; or an empty string (&amp;quot;&amp;quot;).&lt;br /&gt;
-- @author User:Demian&lt;br /&gt;
function p.isEmpty(str)&lt;br /&gt;
	return nil == str or &amp;quot;&amp;quot; == str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.mapColour(colourName)&lt;br /&gt;
    local foreground = &amp;quot;white&amp;quot;&lt;br /&gt;
    local background = &amp;quot;#1165AF&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    mw.log(colourName)&lt;br /&gt;
&lt;br /&gt;
    colour_map = {&lt;br /&gt;
        [&amp;quot;aliceblue&amp;quot;] = &amp;quot;f0f8ff&amp;quot;,&lt;br /&gt;
        [&amp;quot;antiquewhite&amp;quot;] = &amp;quot;faebd7&amp;quot;,&lt;br /&gt;
        [&amp;quot;aqua&amp;quot;] = &amp;quot;00ffff&amp;quot;,&lt;br /&gt;
        [&amp;quot;aquamarine&amp;quot;] = &amp;quot;7fffd4&amp;quot;,&lt;br /&gt;
        [&amp;quot;azure&amp;quot;] = &amp;quot;f0ffff&amp;quot;,&lt;br /&gt;
        [&amp;quot;beige&amp;quot;] = &amp;quot;f5f5dc&amp;quot;,&lt;br /&gt;
        [&amp;quot;bisque&amp;quot;] = &amp;quot;ffe4c4&amp;quot;,&lt;br /&gt;
        [&amp;quot;black&amp;quot;] = &amp;quot;000000&amp;quot;,&lt;br /&gt;
        [&amp;quot;blanchedalmond&amp;quot;] = &amp;quot;ffebcd&amp;quot;,&lt;br /&gt;
        [&amp;quot;blue&amp;quot;] = &amp;quot;0000ff&amp;quot;,&lt;br /&gt;
        [&amp;quot;blueviolet&amp;quot;] = &amp;quot;8a2be2&amp;quot;,&lt;br /&gt;
        [&amp;quot;brown&amp;quot;] = &amp;quot;a52a2a&amp;quot;,&lt;br /&gt;
        [&amp;quot;burlywood&amp;quot;] = &amp;quot;deb887&amp;quot;,&lt;br /&gt;
        [&amp;quot;cadetblue&amp;quot;] = &amp;quot;5f9ea0&amp;quot;,&lt;br /&gt;
        [&amp;quot;chartreuse&amp;quot;] = &amp;quot;7fff00&amp;quot;,&lt;br /&gt;
        [&amp;quot;chocolate&amp;quot;] = &amp;quot;d2691e&amp;quot;,&lt;br /&gt;
        [&amp;quot;coral&amp;quot;] = &amp;quot;ff7f50&amp;quot;,&lt;br /&gt;
        [&amp;quot;cornflowerblue&amp;quot;] = &amp;quot;6495ed&amp;quot;,&lt;br /&gt;
        [&amp;quot;cornsilk&amp;quot;] = &amp;quot;fff8dc&amp;quot;,&lt;br /&gt;
        [&amp;quot;crimson&amp;quot;] = &amp;quot;dc143c&amp;quot;,&lt;br /&gt;
        [&amp;quot;cyan&amp;quot;] = &amp;quot;00ffff&amp;quot;,&lt;br /&gt;
        [&amp;quot;darkblue&amp;quot;] = &amp;quot;00008b&amp;quot;,&lt;br /&gt;
        [&amp;quot;darkcyan&amp;quot;] = &amp;quot;008b8b&amp;quot;,&lt;br /&gt;
        [&amp;quot;darkgoldenrod&amp;quot;] = &amp;quot;b8860b&amp;quot;,&lt;br /&gt;
        [&amp;quot;darkgray&amp;quot;] = &amp;quot;a9a9a9&amp;quot;,&lt;br /&gt;
        [&amp;quot;darkgreen&amp;quot;] = &amp;quot;006400&amp;quot;,&lt;br /&gt;
        [&amp;quot;darkkhaki&amp;quot;] = &amp;quot;bdb76b&amp;quot;,&lt;br /&gt;
        [&amp;quot;darkmagenta&amp;quot;] = &amp;quot;8b008b&amp;quot;,&lt;br /&gt;
        [&amp;quot;darkolivegreen&amp;quot;] = &amp;quot;556b2f&amp;quot;,&lt;br /&gt;
        [&amp;quot;darkorange&amp;quot;] = &amp;quot;ff8c00&amp;quot;,&lt;br /&gt;
        [&amp;quot;darkorchid&amp;quot;] = &amp;quot;9932cc&amp;quot;,&lt;br /&gt;
        [&amp;quot;darkred&amp;quot;] = &amp;quot;8b0000&amp;quot;,&lt;br /&gt;
        [&amp;quot;darksalmon&amp;quot;] = &amp;quot;e9967a&amp;quot;,&lt;br /&gt;
        [&amp;quot;darkseagreen&amp;quot;] = &amp;quot;8fbc8f&amp;quot;,&lt;br /&gt;
        [&amp;quot;darkslateblue&amp;quot;] = &amp;quot;483d8b&amp;quot;,&lt;br /&gt;
        [&amp;quot;darkslategray&amp;quot;] = &amp;quot;2f4f4f&amp;quot;,&lt;br /&gt;
        [&amp;quot;darkturquoise&amp;quot;] = &amp;quot;00ced1&amp;quot;,&lt;br /&gt;
        [&amp;quot;darkviolet&amp;quot;] = &amp;quot;9400d3&amp;quot;,&lt;br /&gt;
        [&amp;quot;deeppink&amp;quot;] = &amp;quot;ff1493&amp;quot;,&lt;br /&gt;
        [&amp;quot;deepskyblue&amp;quot;] = &amp;quot;00bfff&amp;quot;,&lt;br /&gt;
        [&amp;quot;dimgray&amp;quot;] = &amp;quot;696969&amp;quot;,&lt;br /&gt;
        [&amp;quot;dodgerblue&amp;quot;] = &amp;quot;1e90ff&amp;quot;,&lt;br /&gt;
        [&amp;quot;feldspar&amp;quot;] = &amp;quot;d19275&amp;quot;,&lt;br /&gt;
        [&amp;quot;firebrick&amp;quot;] = &amp;quot;b22222&amp;quot;,&lt;br /&gt;
        [&amp;quot;floralwhite&amp;quot;] = &amp;quot;fffaf0&amp;quot;,&lt;br /&gt;
        [&amp;quot;forestgreen&amp;quot;] = &amp;quot;228b22&amp;quot;,&lt;br /&gt;
        [&amp;quot;fuchsia&amp;quot;] = &amp;quot;ff00ff&amp;quot;,&lt;br /&gt;
        [&amp;quot;gainsboro&amp;quot;] = &amp;quot;dcdcdc&amp;quot;,&lt;br /&gt;
        [&amp;quot;ghostwhite&amp;quot;] = &amp;quot;f8f8ff&amp;quot;,&lt;br /&gt;
        [&amp;quot;gold&amp;quot;] = &amp;quot;ffd700&amp;quot;,&lt;br /&gt;
        [&amp;quot;goldenrod&amp;quot;] = &amp;quot;daa520&amp;quot;,&lt;br /&gt;
        [&amp;quot;gray&amp;quot;] = &amp;quot;808080&amp;quot;,&lt;br /&gt;
        [&amp;quot;green&amp;quot;] = &amp;quot;008000&amp;quot;,&lt;br /&gt;
        [&amp;quot;greenyellow&amp;quot;] = &amp;quot;adff2f&amp;quot;,&lt;br /&gt;
        [&amp;quot;honeydew&amp;quot;] = &amp;quot;f0fff0&amp;quot;,&lt;br /&gt;
        [&amp;quot;hotpink&amp;quot;] = &amp;quot;ff69b4&amp;quot;,&lt;br /&gt;
        [&amp;quot;indianred &amp;quot;] = &amp;quot;cd5c5c&amp;quot;,&lt;br /&gt;
        [&amp;quot;indigo &amp;quot;] = &amp;quot;4b0082&amp;quot;,&lt;br /&gt;
        [&amp;quot;ivory&amp;quot;] = &amp;quot;fffff0&amp;quot;,&lt;br /&gt;
        [&amp;quot;khaki&amp;quot;] = &amp;quot;f0e68c&amp;quot;,&lt;br /&gt;
        [&amp;quot;lavender&amp;quot;] = &amp;quot;e6e6fa&amp;quot;,&lt;br /&gt;
        [&amp;quot;lavenderblush&amp;quot;] = &amp;quot;fff0f5&amp;quot;,&lt;br /&gt;
        [&amp;quot;lawngreen&amp;quot;] = &amp;quot;7cfc00&amp;quot;,&lt;br /&gt;
        [&amp;quot;lemonchiffon&amp;quot;] = &amp;quot;fffacd&amp;quot;,&lt;br /&gt;
        [&amp;quot;lightblue&amp;quot;] = &amp;quot;add8e6&amp;quot;,&lt;br /&gt;
        [&amp;quot;lightcoral&amp;quot;] = &amp;quot;f08080&amp;quot;,&lt;br /&gt;
        [&amp;quot;lightcyan&amp;quot;] = &amp;quot;e0ffff&amp;quot;,&lt;br /&gt;
        [&amp;quot;lightgoldenrodyellow&amp;quot;] = &amp;quot;fafad2&amp;quot;,&lt;br /&gt;
        [&amp;quot;lightgrey&amp;quot;] = &amp;quot;d3d3d3&amp;quot;,&lt;br /&gt;
        [&amp;quot;lightgreen&amp;quot;] = &amp;quot;90ee90&amp;quot;,&lt;br /&gt;
        [&amp;quot;lightpink&amp;quot;] = &amp;quot;ffb6c1&amp;quot;,&lt;br /&gt;
        [&amp;quot;lightsalmon&amp;quot;] = &amp;quot;ffa07a&amp;quot;,&lt;br /&gt;
        [&amp;quot;lightseagreen&amp;quot;] = &amp;quot;20b2aa&amp;quot;,&lt;br /&gt;
        [&amp;quot;lightskyblue&amp;quot;] = &amp;quot;87cefa&amp;quot;,&lt;br /&gt;
        [&amp;quot;lightslateblue&amp;quot;] = &amp;quot;8470ff&amp;quot;,&lt;br /&gt;
        [&amp;quot;lightslategray&amp;quot;] = &amp;quot;778899&amp;quot;,&lt;br /&gt;
        [&amp;quot;lightsteelblue&amp;quot;] = &amp;quot;b0c4de&amp;quot;,&lt;br /&gt;
        [&amp;quot;lightyellow&amp;quot;] = &amp;quot;ffffe0&amp;quot;,&lt;br /&gt;
        [&amp;quot;lime&amp;quot;] = &amp;quot;00ff00&amp;quot;,&lt;br /&gt;
        [&amp;quot;limegreen&amp;quot;] = &amp;quot;32cd32&amp;quot;,&lt;br /&gt;
        [&amp;quot;linen&amp;quot;] = &amp;quot;faf0e6&amp;quot;,&lt;br /&gt;
        [&amp;quot;magenta&amp;quot;] = &amp;quot;ff00ff&amp;quot;,&lt;br /&gt;
        [&amp;quot;maroon&amp;quot;] = &amp;quot;800000&amp;quot;,&lt;br /&gt;
        [&amp;quot;mediumaquamarine&amp;quot;] = &amp;quot;66cdaa&amp;quot;,&lt;br /&gt;
        [&amp;quot;mediumblue&amp;quot;] = &amp;quot;0000cd&amp;quot;,&lt;br /&gt;
        [&amp;quot;mediumorchid&amp;quot;] = &amp;quot;ba55d3&amp;quot;,&lt;br /&gt;
        [&amp;quot;mediumpurple&amp;quot;] = &amp;quot;9370d8&amp;quot;,&lt;br /&gt;
        [&amp;quot;mediumseagreen&amp;quot;] = &amp;quot;3cb371&amp;quot;,&lt;br /&gt;
        [&amp;quot;mediumslateblue&amp;quot;] = &amp;quot;7b68ee&amp;quot;,&lt;br /&gt;
        [&amp;quot;mediumspringgreen&amp;quot;] = &amp;quot;00fa9a&amp;quot;,&lt;br /&gt;
        [&amp;quot;mediumturquoise&amp;quot;] = &amp;quot;48d1cc&amp;quot;,&lt;br /&gt;
        [&amp;quot;mediumvioletred&amp;quot;] = &amp;quot;c71585&amp;quot;,&lt;br /&gt;
        [&amp;quot;midnightblue&amp;quot;] = &amp;quot;191970&amp;quot;,&lt;br /&gt;
        [&amp;quot;mintcream&amp;quot;] = &amp;quot;f5fffa&amp;quot;,&lt;br /&gt;
        [&amp;quot;mistyrose&amp;quot;] = &amp;quot;ffe4e1&amp;quot;,&lt;br /&gt;
        [&amp;quot;moccasin&amp;quot;] = &amp;quot;ffe4b5&amp;quot;,&lt;br /&gt;
        [&amp;quot;navajowhite&amp;quot;] = &amp;quot;ffdead&amp;quot;,&lt;br /&gt;
        [&amp;quot;navy&amp;quot;] = &amp;quot;000080&amp;quot;,&lt;br /&gt;
        [&amp;quot;oldlace&amp;quot;] = &amp;quot;fdf5e6&amp;quot;,&lt;br /&gt;
        [&amp;quot;olive&amp;quot;] = &amp;quot;808000&amp;quot;,&lt;br /&gt;
        [&amp;quot;olivedrab&amp;quot;] = &amp;quot;6b8e23&amp;quot;,&lt;br /&gt;
        [&amp;quot;orange&amp;quot;] = &amp;quot;ffa500&amp;quot;,&lt;br /&gt;
        [&amp;quot;orangered&amp;quot;] = &amp;quot;ff4500&amp;quot;,&lt;br /&gt;
        [&amp;quot;orchid&amp;quot;] = &amp;quot;da70d6&amp;quot;,&lt;br /&gt;
        [&amp;quot;palegoldenrod&amp;quot;] = &amp;quot;eee8aa&amp;quot;,&lt;br /&gt;
        [&amp;quot;palegreen&amp;quot;] = &amp;quot;98fb98&amp;quot;,&lt;br /&gt;
        [&amp;quot;paleturquoise&amp;quot;] = &amp;quot;afeeee&amp;quot;,&lt;br /&gt;
        [&amp;quot;palevioletred&amp;quot;] = &amp;quot;d87093&amp;quot;,&lt;br /&gt;
        [&amp;quot;papayawhip&amp;quot;] = &amp;quot;ffefd5&amp;quot;,&lt;br /&gt;
        [&amp;quot;peachpuff&amp;quot;] = &amp;quot;ffdab9&amp;quot;,&lt;br /&gt;
        [&amp;quot;peru&amp;quot;] = &amp;quot;cd853f&amp;quot;,&lt;br /&gt;
        [&amp;quot;pink&amp;quot;] = &amp;quot;ffc0cb&amp;quot;,&lt;br /&gt;
        [&amp;quot;plum&amp;quot;] = &amp;quot;dda0dd&amp;quot;,&lt;br /&gt;
        [&amp;quot;powderblue&amp;quot;] = &amp;quot;b0e0e6&amp;quot;,&lt;br /&gt;
        [&amp;quot;purple&amp;quot;] = &amp;quot;800080&amp;quot;,&lt;br /&gt;
        [&amp;quot;red&amp;quot;] = &amp;quot;ff0000&amp;quot;,&lt;br /&gt;
        [&amp;quot;rosybrown&amp;quot;] = &amp;quot;bc8f8f&amp;quot;,&lt;br /&gt;
        [&amp;quot;royalblue&amp;quot;] = &amp;quot;4169e1&amp;quot;,&lt;br /&gt;
        [&amp;quot;saddlebrown&amp;quot;] = &amp;quot;8b4513&amp;quot;,&lt;br /&gt;
        [&amp;quot;salmon&amp;quot;] = &amp;quot;fa8072&amp;quot;,&lt;br /&gt;
        [&amp;quot;sandybrown&amp;quot;] = &amp;quot;f4a460&amp;quot;,&lt;br /&gt;
        [&amp;quot;seagreen&amp;quot;] = &amp;quot;2e8b57&amp;quot;,&lt;br /&gt;
        [&amp;quot;seashell&amp;quot;] = &amp;quot;fff5ee&amp;quot;,&lt;br /&gt;
        [&amp;quot;sienna&amp;quot;] = &amp;quot;a0522d&amp;quot;,&lt;br /&gt;
        [&amp;quot;silver&amp;quot;] = &amp;quot;c0c0c0&amp;quot;,&lt;br /&gt;
        [&amp;quot;skyblue&amp;quot;] = &amp;quot;87ceeb&amp;quot;,&lt;br /&gt;
        [&amp;quot;slateblue&amp;quot;] = &amp;quot;6a5acd&amp;quot;,&lt;br /&gt;
        [&amp;quot;slategray&amp;quot;] = &amp;quot;708090&amp;quot;,&lt;br /&gt;
        [&amp;quot;snow&amp;quot;] = &amp;quot;fffafa&amp;quot;,&lt;br /&gt;
        [&amp;quot;springgreen&amp;quot;] = &amp;quot;00ff7f&amp;quot;,&lt;br /&gt;
        [&amp;quot;steelblue&amp;quot;] = &amp;quot;4682b4&amp;quot;,&lt;br /&gt;
        [&amp;quot;tan&amp;quot;] = &amp;quot;d2b48c&amp;quot;,&lt;br /&gt;
        [&amp;quot;teal&amp;quot;] = &amp;quot;008080&amp;quot;,&lt;br /&gt;
        [&amp;quot;thistle&amp;quot;] = &amp;quot;d8bfd8&amp;quot;,&lt;br /&gt;
        [&amp;quot;tomato&amp;quot;] = &amp;quot;ff6347&amp;quot;,&lt;br /&gt;
        [&amp;quot;turquoise&amp;quot;] = &amp;quot;40e0d0&amp;quot;,&lt;br /&gt;
        [&amp;quot;violet&amp;quot;] = &amp;quot;ee82ee&amp;quot;,&lt;br /&gt;
        [&amp;quot;violetred&amp;quot;] = &amp;quot;d02090&amp;quot;,&lt;br /&gt;
        [&amp;quot;wheat&amp;quot;] = &amp;quot;f5deb3&amp;quot;,&lt;br /&gt;
        [&amp;quot;white&amp;quot;] = &amp;quot;ffffff&amp;quot;,&lt;br /&gt;
        [&amp;quot;whitesmoke&amp;quot;] = &amp;quot;f5f5f5&amp;quot;,&lt;br /&gt;
        [&amp;quot;yellow&amp;quot;] = &amp;quot;ffff00&amp;quot;,&lt;br /&gt;
        [&amp;quot;yellowgreen&amp;quot;] = &amp;quot;9acd32&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    colour_found = colour_map[colourName:lower()]&lt;br /&gt;
    if colour_found ~= nil then&lt;br /&gt;
        background = &#039;#&#039; .. colour_found&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return foreground, background&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Linskyter</name></author>
	</entry>
</feed>