Module:Main

From Zelda Wiki, the Zelda encyclopedia
Jump to navigation Jump to search
This is the main module for the following templates:

Not to be confused with Module:Main Page.


local p = {}

local utilsArg = require("Module:UtilsArg")
local utilsError = require("Module:UtilsError")
local utilsMarkup = require("Module:UtilsMarkup")
local utilsString = require("Module:UtilsString")
local utilsTable = require("Module:UtilsTable")

local CATEGORY_INVALID_ARGS = "[[Category:"..require("Module:Constants/category/invalidArgs").."]]"

function p.Main(frame)
	local args, err = utilsArg.parse(frame:getParent().args, p.Templates.Main)
	local categories = err and err.categoryText or ""
	
	local pages = args.pages
	if pages == nil or #pages == 0 then
		return "", categories
	elseif #pages == 1 then -- assume list items are delimited by commas instead of pipes
		pages = utilsString.split(pages[1])
	end
	
	pages = utilsTable.map(pages, p.formatListItem)
	local pagesOld = pages
	pages = utilsTable.compact(pages) -- remove nils
	if #pagesOld ~= #pages then
		utilsError.warn(string.format("Page list cannot have blank entries: <code>%s</code>", frame:getParent().args[1]))
		categories = categories..CATEGORY_INVALID_ARGS
	end

	local text = #pages > 1 and "Main articles: " or "Main article: "
	local pageList = text..mw.text.listToText(pages)
	local hatnote = frame:expandTemplate({
		title = "Hatnote",
		args = {pageList},
	})

	return hatnote, categories
end

function p.formatListItem(item)
	item = mw.text.decode(item)
	if utilsString.isBlank(item) then
		return nil
	elseif utilsMarkup.containsLink(item) then
		return item
	elseif string.find(item, "#") then
		local linkDisplay = string.gsub(item, "#", " § ")
		return string.format("[[%s|%s]]", item, linkDisplay)
	else
		return string.format("[[%s]]", item)
	end
end

p.Templates = {
	["Main"] = {
		purpose = "To be placed under a heading when that section's topic has its own page or pages.",
		categories = {"Formatting templates"},
		params = {
			["..."] = {
				name = "pages",
				required = true,
				desc = "Article names",
				trim = true,
				nilIfEmpty = true,
			},
		},
	}
}

return p