Lua reference manual/Fandom libraries

Fandom supplies a library of convenience functions for typical wiki operations.
== Wikitext library ==
This library was originally developed for the Lua InfoboxBuilder's High Frequency functions. Due to the cumbersome name, it is suggested that frequently used functions be stored as a local table as in local HF = mw.InfoboxBuilderHF.
=== mw.InfoboxBuilderHF.explode ===
mw.InfoboxBuilderHF.explode( sep, text )
Similar to mw.text.split
=== mw.InfoboxBuilderHF.isempty ===
mw.InfoboxBuilderHF.isempty( s )
Returns "true" if the object supplied is nil, an empty string, or a table with no objects. 
=== mw.InfoboxBuilderHF.firstToUpper ===
mw.InfoboxBuilderHF.firstToUpper( str )
Applies string.upper to the first character of a string.
=== mw.InfoboxBuilderHF.round ===
mw.InfoboxBuilderHF.round( num, idp )
=== mw.InfoboxBuilderHF.trim ===
mw.InfoboxBuilderHF.trim( s )
=== mw.InfoboxBuilderHF.unique ===
mw.InfoboxBuilderHF.unique( raw_table )
De-duplicates the items in raw_table and returns them as a table.
=== mw.InfoboxBuilderHF.Link ===
mw.InfoboxBuilderHF.Link( link, text )
Returns a wikitext internal link / "wiki-link" to the target page link.
If text is supplied, it will be used as a text label for the link.
 
=== mw.InfoboxBuilderHF.Link_safe ===
mw.InfoboxBuilderHF.Link_safe( object )
Returns a wikitext internal link / "wiki-link" to the target page object if and only if the target page exists. If the target page does not exist, returns object as an unlinked plain text string.
If object supplied is already a wikitext link, it will pass through as-is without checking for page existence.
=== mw.InfoboxBuilderHF.ExternalLink ===
mw.InfoboxBuilderHF.ExternalLink( target, label, plain )
Returns a wikitext external link to a URL in target.
If label is supplied, it will be used as a text label for the link.
If plain is supplied, the link will be enveloped in a span.plainlinks.
=== mw.InfoboxBuilderHF.Category ===
mw.InfoboxBuilderHF.Category( category, sortkey )
Adds the invoking page to a MediaWiki Category.
If sortkey is supplied, it will be used as a sort key for the association.
It is not needed to prefix the category with "Category:".
=== mw.InfoboxBuilderHF.LinkToCategory ===
mw.InfoboxBuilderHF.LinkToCategory( category, label )
Returns a link to a MediaWiki category.
If label is supplied, it will be used as a text label for the link.
It is not needed to prefix the category with "Category:".
=== mw.InfoboxBuilderHF.CategoryLink ===
mw.InfoboxBuilderHF.CategoryLink( category, sortkey, label )
Adds the invoking page to a MediaWiki Category.
If sortkey is supplied, it will be used as a sort key for the association.
If label is supplied, it will also return an internal link to the Category page using the value provided as a link label.
It is not needed to prefix the category with "Category:".
=== mw.InfoboxBuilderHF.LinkToCategory_safe ===
mw.InfoboxBuilderHF.LinkToCategory_safe( object )
Returns a wikitext internal link to the target Category page object if and only if the target Category page exists (and has content). If the target page does not exist, returns object as an unlinked plain text string.
It is not needed to prefix the category with "Category:".
This function increments the expensive parser function count.
=== mw.InfoboxBuilderHF.KillNewCategories ===
mw.InfoboxBuilderHF.KillNewCategories( object )
Adds the invoking page to a MediaWiki Category object if and only if the target Category page exists (and has content). If the target page does not exist, returns object as an unlinked plain text string.
It is not needed to prefix the category with "Category:".
local HF = {}
function HF.explode( sep, text )
	local sep, fields = sep or "::", {}
	local pattern = string.format("([^%s]+)", sep)
	text:gsub( pattern, function( c ) fields[#fields+1] = c end )
	return fields
end
function HF.isempty(s)
	local result = false
	if type( s ) == "nil" then
		result = true
	elseif type( s ) == "string" then
		if s == "" then
			result = true
		end
	elseif type( s ) == "table" then
		if next( s ) == nil then
			result = true
		end
	end
	return result
end
function HF.firstToUpper( str )
	return ( str:gsub( "^%l", string.upper ) )
end
function HF.round(num, idp)
	local mult = 10^(idp or 0)
	return math.floor( num * mult + 0.5 ) / mult
end
-- eliminates whitespace from the front and back of a string
function HF.trim(s)
 if type(s) == 'string' then
 return (s:gsub("^%s*(.-)%s*$", '%1'))
 else
 return false
 end
end
-- This creates an external link.
function HF.ExternalLink( target, label, plain )
 local output = string.format('[%s %s]', target, label)
 if plain == true then
 output = string.format('%s', output)
 end
 return output
end
-- This creates a link to a category, as well as placing it in that category.
-- `sortkey` and `label` are optional
-- If there's no `label` given, it will only place it in the category,
-- which is what HF.Category is for.
function HF.CategoryLink( category, sortkey, label )
 if not HF.isempty( label ) then
 return HF.LinkToCategory( category, label ) ..
 HF.Category( category, sortkey )
 else
 return HF.Category( category, sortkey )
 end
end
-- Adds a Category
-- `sortkey` is optional
function HF.Category( category, sortkey )
 if sortkey == nil then sortkey = else sortkey = '|' .. sortkey end
 return string.format('%s' .. mw.site.namespaces[14].canonicalName .. ':%s%s]]', '[[', category, sortkey)
end
-- Adds a link to a Category
function HF.LinkToCategory( category, label )
 local category_namespace_name = mw.site.namespaces[14].canonicalName
 return string.format('%s'..category_namespace_name..':%s|%s]]', '[[:', category,
 label or category_namespace_name..':' .. category )
end
-- Adds an internal link
-- `label` is optional
function HF.Link( link, text )
 if not HF.isempty( text ) then
 return string.format('%s'..'%s|%s]]', '[[', link, text)
 else
 return string.format('%s'..'%s]]', '[[', link)
 end
end
-- Checks to see if there's an existing article at the target.
-- If there is, creates a link.
-- If there's not, only write the target's name as text.
-- If it is passed a link, it will not perform this check and will only write the link.
function HF.Link_safe( object )
 if object:match("^%[%[(.*)%]%]$") then
 return object
 elseif mw.title.new( object ).exists == true then
 return HF.Link( object )
 else
 return object
 end
end
-- Checks to see if there's an existing category at the target.
-- If there is, creates a link.
-- If there's not, only write the target's name as text.
function HF.LinkToCategory_safe( object )
 if mw.title.new( object, 14 ).exists == true then
 return HF.Link( ':'..mw.site.namespaces[14].canonicalName..':'..object, object )
 else
 return object
 end
end
-- Checks to see if there's an existing category at the target.
-- If there is, creates a link.
-- If there's not, only write the target's name as text.
function HF.KillNewCategories( object )
 if mw.title.new( object, 14 ).exists == true then
 return HF.Category( object, object, object)
 else
 return object
 end
end
-- Unique table items
function HF.unique( raw_table )
 local hash = {}
 local unique_results = {}
 for _,v in ipairs( raw_table ) do
 if (not hash[v] and v ~= ) then
 table.insert( unique_results, mw.text.trim(v) )
 hash[v] = true
 end
 end
 return unique_results
end
Category:Lua