Модуль:PageHero

Для документации этого модуля может быть создана страница Модуль:PageHero/doc

-- Module:PageHero
-- Generates hero header data for SiberiaSkin.
-- Usage: {{#invoke:PageHero|hero|kicker=...|title-before=...|...}}

local p = {}

-- Split a string by newline, trim each part, skip empty
local function splitLines( s )
	local result = {}
	for line in s:gmatch( '[^\n]+' ) do
		local trimmed = mw.text.trim( line )
		if trimmed ~= '' then
			result[#result + 1] = trimmed
		end
	end
	return result
end

function p.hero( frame )
	local args = frame.args
	-- fall back to parent (template) args
	if not args.kicker then
		args = frame:getParent().args
	end

	local accent = args['accent-color'] or '#ff6677'
	local titleBefore = mw.text.trim( args['title-before'] or '' )
	local titleAccent = mw.text.trim( args['title-accent'] or '' )
	local titleAfter  = mw.text.trim( args['title-after'] or '' )

	-- Hidden data div (consumed by JS)
	local out = '<div class="ss-hero-data"'
	if args.kicker then
		out = out .. ' data-kicker="' .. mw.text.trim( args.kicker ) .. '"'
	end
	if args.lede then
		out = out .. ' data-lede="' .. mw.text.trim( args.lede ) .. '"'
	end
	out = out .. ' data-accent="' .. accent .. '"'
	if titleBefore ~= '' then
		out = out .. ' data-title-before="' .. titleBefore .. '"'
	end
	if titleAccent ~= '' then
		out = out .. ' data-title-accent="' .. titleAccent .. '"'
	end
	if titleAfter ~= '' then
		out = out .. ' data-title-after="' .. titleAfter .. '"'
	end
	out = out .. '></div>\n'

	-- Dossier panel (if header provided)
	if args['dossier-header'] then
		out = out .. '<div class="ss-hero-dossier">\n'
		out = out .. '<div class="ss-dossier-stripe"></div>\n'
		out = out .. '<div class="ss-dossier-head">'
		out = out .. '<span>' .. mw.text.trim( args['dossier-header'] ) .. '</span>'
		if args['dossier-level'] then
			out = out .. '<span class="ss-dossier-level">'
				.. mw.text.trim( args['dossier-level'] ) .. '</span>'
		end
		out = out .. '</div>\n'

		-- Rows: key and val are multi-line strings, paired by line number
		local rawKey = args.key or ''
		local rawVal = args.val or ''
		local keys = splitLines( rawKey )
		local vals = splitLines( rawVal )
		local count = math.max( #keys, #vals )

		if count > 0 then
			out = out .. '<div class="ss-dossier-body">\n'
			for i = 1, count do
				local k = keys[i] or ''
				local v = vals[i] or ''
				out = out .. '<div class="ss-ds-row">'
				out = out .. '<div class="ss-ds-k">' .. k .. '</div>'
				out = out .. '<div class="ss-ds-v">' .. v .. '</div>'
				out = out .. '</div>\n'
			end
			out = out .. '</div>\n'
		end

		out = out .. '</div>\n'
	end

	return out
end

return p