Module:Navcards

From Halopedia, the Halo wiki

Documentation for this module may be created at ModuleDoc:Navcards

local mArguments --initialize lazily
local getArgNums = require('Module:Common').getArgNums
local p = {}


--Implements {{navcards}} from the frame
function p.navcards(frame)
	mArguments = require('Module:Arguments2')
	return p._navcards(mArguments.getArgs(frame), frame)
end

function p._navcards(args, frame)
	if not args then
		return 'Missing arguments'
	end

	local html = mw.html.create('div'):addClass('template-navcards')
	local content = mw.html.create('div'):addClass('template-navcards-content')

	local thumbWidth = args['thumbwidth'] or 240
	html:css('--tg-navcards-aspect-ratio', args['aspectratio'] or '1')
	content:css('grid-template-columns', string.format('repeat(auto-fit, minmax(%spx, 1fr))', thumbWidth * 2 / 3))

	if args['header'] then
		local divider = frame:expandTemplate { title = 'Section divider', args = { args['header'] } }
		html:tag('div'):addClass('template-navcards-header')
			:wikitext(divider)
			:done()
	end

	local cardCount = 0
	for i, _ in ipairs(getArgNums('page', args)) do
		local num = tostring(i)
		if not args['page' .. num] then return end

		local navcard = mw.html.create('div'):addClass('template-navcard')

		local image = mw.html.create('div'):addClass('template-navcard-image')
		if args['image' .. num] then
			image:wikitext(string.format('[[File:%s|%spx|link=]]', args['image' .. num], thumbWidth*2))
		end

		local text = mw.html.create('div'):addClass('template-navcard-text')
		text:tag('div'):addClass('template-navcard-title')
			:wikitext(args['title' .. num] or args['page' .. num])
			:done()
		if args['caption' .. num] then
			text:tag('div'):addClass('template-navcard-caption')
				:wikitext(args['caption' .. num])
		end

		navcard:node(image)
		navcard:node(text)
		navcard:tag('div'):addClass('template-navcard-link')
			:wikitext(string.format('[[%s]]', args['page' .. num]))
		content:node(navcard)
		cardCount = cardCount + 1
	end

	html:addClass('template-navcards--count-' .. cardCount)

	html:node(content)

	return frame:extensionTag {
		name = 'templatestyles', args = { src = 'TemplateStyle:Navcards.css' }
	} .. tostring(html)
end

return p