Module:Data Table/Tags: Difference between revisions

From Zelda Wiki, the Zelda encyclopedia
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
local File = require("Module:File")
local File = require("Module:File")
local Franchise = require("Module:Franchise")
local GalleryList = require("Module:Gallery List")
local GalleryList = require("Module:Gallery List")
local Sequences = require("Module:Sequences")
local Sequences = require("Module:Sequences")
Line 160: Line 161:
["Defense"] = value("Defense", true),
["Defense"] = value("Defense", true),
["Description"] = function(cell, tableArgs, tagArgs)
["Description"] = function(cell, tableArgs, tagArgs)
local text = string.gsub(cell, "%[Player Name%]", h.playerName())
local text = string.gsub(cell, "%[Player Name%]", playerName())
text = "\n"..text.."\n" -- bullet lists don't work without the newlines
text = "\n"..text.."\n" -- bullet lists don't work without the newlines
return {
return {
Line 222: Line 223:
["Name"] = function(cell, tableArgs, tagArgs)
["Name"] = function(cell, tableArgs, tagArgs)
local cellSize = cell:len()
local cellSize = cell:len()
cell = string.gsub(cell, "%[Player Name%]", h.playerName())
cell = string.gsub(cell, "%[Player Name%]", playerName())
cell = GalleryList.stripVariantSyntax(cell)
cell = GalleryList.stripVariantSyntax(cell)
return {
return {

Revision as of 20:59, 11 December 2022


local File = require("Module:File")
local Franchise = require("Module:Franchise")
local GalleryList = require("Module:Gallery List")
local Sequences = require("Module:Sequences")
local Term = require("Module:Term")
local TermList = require("Module:Term List")
local utilsMarkup = require("Module:UtilsMarkup")
local utilsString = require("Module:UtilsString")
local utilsTable = require("Module:UtilsTable")

local frame = mw.getCurrentFrame()

local playerName
local function playerName()
	return playerName or frame:expandTemplate({
		title = "Player Name"
	})
end

local function list(items, bulletList)
	if bulletList then
		return utilsMarkup.bulletList(items)
	elseif #items > 1 then
		return utilsMarkup.list(items)
	else
		return items[1]
	end
end

local function value(templateName, hasGameParam)
	return function(cell, tableArgs, tagArgs)
		local values = utilsString.split(cell, '%s*,[%D+|%s*]')
		local amountGame = tableArgs.game or tagArgs[1]
		local format = tagArgs[2]
		local cellSize = 0
		values = utilsTable.map(values, function(value)
			local value, info = TermList.separateAdditionalInfo(value)
			cellSize = math.max(cellSize, value)
			local args = {value, format}
			if hasGameParam then
				table.insert(args, 1, amountGame)
			end
			local text = frame:expandTemplate({
				title = templateName,
				args = args,
			})
			return text..info
		end)
		local valuesList = list(values)
		local sortValue
		if #values == 1 then
			sortValue = values[1]:gsub(",", "")
		end
		return {
			text = valuesList,
			size = cell:len(),
			sortValue = sortValue
		}
	end
end

local function terms(tagName)
	return function(cell, tableArgs, tagArgs)
		cell = string.gsub(cell, "%[Player Name%]", "Link")
		local pages
		if tagName == "Term" or tagName == "Plural" then
			pages = {cell}
		else
			pages = utilsString.split(cell)
		end
		pages = utilsTable.map(pages, GalleryList.stripVariantSyntax)
		local termLinks, terms = TermList.termList(tagArgs[1] or tableArgs.game, pages, {
			plural = tagName == "Plural",
			link = true,
		})
	
		local cellSize = 0
		for i in ipairs(termLinks) do
			local term = terms[i]
			cellSize = math.max(term:len(), cellSize)
		end
	
		local isBulletList = tagName == "TermList" or tagName == "PluralList"
		local list = list(termLinks, isBulletList)
	
		local sortValue
		if #termLinks == 1 then
			sortValue = terms[1]
		end
		return {
			text = list,
			sortValue = sortValue,
			size = cellSize
		}
	end
end

local spanningCell
local spanCount
function computeRowspan(cell, isLastRow)
	if not spanningCell then
		spanningCell = cell
		spanCount = 1
	elseif tostring(cell.content) == tostring(spanningCell.content) then
		cell.skip = true
		spanCount = spanCount + 1
	else
		spanningCell.rowspan = spanCount
		spanningCell = cell
		spanCount = 1
	end
	if isLastRow then
		spanningCell.rowspan = spanCount
	end
end

local p = {
	-- Each function must return a table containing:
	-- text (required), the text to display in the cell
	-- size (optional), an estimation of the cell's width in characters
	-- sortValue (optional), a column sort value — column is unsortable if no value is returned
	contentTags = {
		[""] = function(cell) -- default: no tags
			local text = string.gsub(cell, "%[Player Name%]", playerName())
			return {
				text = cell,
				size = cell:len(),
			}
		end,
		["N/A"] = function(cell) -- special case: cell starts with N/A
			local text, info = TermList.separateAdditionalInfo(cell)
			local tooltip = utilsMarkup.tooltip("—", "Not Applicable")
			text = text:gsub("N/A", tooltip)
			return {
				text = text,
				sortValue = text,
				size = cell:len(),
			}
		end,

		-- Tags
		["Amounts"] = function(cell, tableArgs, tagArgs)
			local text = frame:expandTemplate({
				title = "Amounts",
				args = {tableArgs.game, cell}
			})

			local cellSize = 0
			local amounts = utilsString.split(cell, '%s*,[%D+|%s*]')
			for i, amount in ipairs(amounts) do
				local item = string.gsub(amount, "$[%d,]+ ", "")
				local subject, info = TermList.separateAdditionalInfo(item)
				cellSize = math.max(cellSize, subject:len())
			end

			return {
				text = text,
				size = cellSize,
			}
		end,
		["Defense"] = value("Defense", true),
		["Description"] = function(cell, tableArgs, tagArgs)
			local text = string.gsub(cell, "%[Player Name%]", playerName())
			text = "\n"..text.."\n" -- bullet lists don't work without the newlines
			return {
				text = text,
				size = cell:len(),
			}
		end,
		["Effect"] = value("Effect", false),
		["HeartAmount"] = function(cell, tableArgs, tagArgs)
			local text = frame:expandTemplate({
				title = "HeartAmount",
				args = {cell, "true"}
			})
			return {
				text = text,
				size = 12,
				sortValue = cell
			}
		end,
		["IconList"] = function(cell, tableArgs, tagArgs)
			local cellSize = 0
			local listItems = utilsString.split(cell)
			for i, listItem in ipairs(listItems) do
				cellSize = math.max(listItem:len(), cellSize)
			end
			local iconList = frame:expandTemplate({
				title = "Icon List",
				args = {tableArgs.game, cell}
			})
			return {
				text = iconList,
				size = cellSize,
			}
		end,
		["Image"] = function(cell, tableArgs, tagArgs)
			cell = string.gsub(cell, "%[Player Name%]", "Link")
			local entries = GalleryList.parseEntries(nil, tableArgs.game, {cell}, {
				useTerms = false,
				fileType = tagArgs[1] or Franchise.graphics(tableArgs.game) == "2D" and "Sprite" or "Icon",
			})
			local image = File.image(entries[1].file, {
				size = tagArgs[2] or "64x64px",
			})
			return {
				text = image,
				size = 20,
			}
		end,
		["List"] = function(cell, tableArgs, tagArgs)
			local listItems = utilsString.split(cell, '%s*,[%D+|%s*]')
			local cellSize = 0
			for i, listItem in ipairs(listItems) do
				cellSize = math.max(cellSize, listItem:len())
			end
			local list = list(listItems, true)
			return {
				text = list,
			}
		end,
		["Mon"] = value("Mon", false),
		["Name"] = function(cell, tableArgs, tagArgs)
			local cellSize = cell:len()
			cell = string.gsub(cell, "%[Player Name%]", playerName())
			cell = GalleryList.stripVariantSyntax(cell)
			return {
				text = cell,
			}
		end,
		["Plural"] = terms("Plural"),
		["PluralList"] = terms("PluralList"),
		["Rupees"] = value("Rupee", true),
		["SortValue"] = function(cell, tableArgs, tagArgs)
			cell = string.gsub(cell, "%[Player Name%]", "Link")
			local sortValue = Sequences.sortValue(tableArgs.game, nil, cell)
			local termLink = Term.link(cell, tableArgs.game)
			return {
				size = cell:len(),
				text = termLink,
			}
		end,
		["Term"] = terms("Term"),
		["Terms"] = terms("Terms"),
		["TermList"] = terms("TermList"),
	},
	attributeTags = {
		["ID"] = function(cell, tableArgs, tagArgs)
			cell.id = string.gsub(cell.raw, "%[Player Name%]", "Link")
		end,
		["Nowrap"] = function(cell, tableArgs, tagArgs)
			cell.content:addClass("data-table__cell-content--nowrap")
		end,
		["Rowspan"] = function(cell, tableArgs, tagArgs)
			local isLastRow = #tableArgs.rows == cell.rowIndex
			computeRowspan(cell, isLastRow)
		end,
		["Unsortable"] = function(cell, tableArgs, tagArgs)
			cell.sortValue = nil
		end,
		["Width"] = function(cell, tableArgs, tagArgs)
			cell.styles = cell.styles or {}
			cell.styles["width"] = tag.args[1]
		end,
	}
}

return p