Modul:Header structure

Saking Wikisource

Dokuméntasi antuk modul puniki prasida kakardi ring Modul:Header structure/doc

--[=[
This is a module to implement logic for header templates
]=]

require('strict')

local p = {} --p stands for package

local yesno = require('Module:Yesno')
local getArgs = require('Module:Arguments').getArgs

-- functions to process stylesheet

function p.get_stylesheet(template)
	return mw.getCurrentFrame():extensionTag('templatestyles', '', {src = template .. '/styles.css'})
end

function p.get_noexport_stylesheet(template)
	return tostring(mw.html.create('div'):addClass('ws-noexport'):wikitext(p.get_stylesheet(template)))
end

-- return true if any value in list is not nil or empty in args
-- (nil means not present; empty string is not nil)
local function has_any_arg(args, list)
	for k,v in pairs(list) do
		if args[v] ~= nil and args[v] ~= "" then
			return true
		end
	end
	return false
end

-- get sisters
local function get_plain_sister(args, sister_args)
	local ps_args = {}
	for k,v in pairs(sister_args) do
		if args[v] then
			ps_args[v] = args[v]
		end
	end
	
	return mw.getCurrentFrame():expandTemplate{title = "plain sister", args = ps_args}
end

--[=[
Construct the main block
]=]
local function construct_main_block(args)
	-- header and tracking categories
	local main_div = mw.html.create('div'):addClass('wst-header-mainblock header-mainblock ' .. (args.main_class or ''))
	if args.main_id then
		main_div:attr('id', args.main_id)
	end
	local cats = {}
	
	-- previous and next fields
	local prev_div = ''
	local next_div = ''
	if args.previous or args['next'] then
		prev_div = mw.html.create('div'):addClass('wst-header-back gen_header_backlink searchaux')
		if args.previous then
			prev_div:node(mw.html.create('div'):addClass('wst-header-back-arrow'):wikitext('←'))
			prev_div:node(mw.html.create('div')
				:attr('id', 'headerprevious')
				:addClass('wst-header-backlink wst-header-previous')
				:wikitext(args.previous)
			)
		else
			prev_div:wikitext('')
		end
		prev_div = tostring(prev_div)
		
		next_div = mw.html.create('div'):addClass('wst-header-forward gen_header_forelink searchaux')
		if args['next'] then
			next_div:node(mw.html.create('div')
				:attr('id', 'headernext')
				:addClass('wst-header-forwardlink wst-header-forward')
				:wikitext(args['next'])
			)
			next_div:node(mw.html.create('div'):addClass('wst-header-forward-arrow'):wikitext('→'))
		else
			next_div:wikitext('')
		end
		next_div = tostring(next_div)
	end
	
	-- central cell
	local center_div = mw.html.create('div'):addClass('wst-header-central-cell gen_header_central_cell')
	
	-- special case to manage exceptional formatting in disambiguation-like pages; not otherwise documented
	local pretitle = ''
	if args.pretitle then
		pretitle = tostring(mw.html.create('span'):addClass('wst-header-pretitle gen_header_pretitle'):wikitext(args.pretitle)) .. '<br/>'
	end
	
	local title = tostring(mw.html.create('span'):addClass('wst-header-title gen_header_title'):wikitext(args.main_title or ''))
	
	center_div:wikitext(pretitle ..title )
	center_div = tostring(center_div)
	
	-- assemble
	main_div:wikitext(prev_div .. center_div .. next_div)
	main_div = tostring(main_div)
	
	return main_div .. table.concat(cats)
end

--[=[
Construct the notes block
]=]
local function construct_notes_block(args)
	local main_div = mw.html.create('div'):addClass('wst-header-notes header_notes searchaux ' .. (args.notes_class or ''))
	if args.notes_id then
		main_div:attr('id', args.notes_id)
	end
	
	-- Left-floated content has to come first, or it may float below the sisters.
	local notes_left_content = ''
	if args.notes_left_content then
		notes_left_content = tostring(mw.html.create('div'):addClass('wst-header-left header_notes_left_content'):wikitext(args.notes_left_content))
	end
	
	local shortcut = ''
	if args.shortcut then
		shortcut = mw.getCurrentFrame():expandTemplate {
			title = 'shortcut',
			args = {args.shortcut}
		}
	end
	
	local notes_content = ''
	if args.notes then
		args.notes = mw.getCurrentFrame():preprocess(args.notes)
		-- linebreaks are so notes get paragraph formatting
		notes_content = tostring(mw.html.create('div'):addClass('wst-header-content header_notes_content'):wikitext('\n' .. args.notes .. '\n'))
	end
	
	local sister
	local wdid = mw.wikibase.getEntityIdForCurrentPage()
	local sister_args = {
		"disambiguation",
		"edition",
		"portal",
		"related_author",
		"wikipedia",
		"commons",
		"commonscat",
		"wikiquote",
		"wikinews",
		"wiktionary",
		"wikibooks",
		"wikidata",
		"wikivoyage",
		"wikiversity",
		"wikispecies",
		"meta",
		"wikidataswitch"
	}
	if wdid or has_any_arg(args, sister_args) then
		sister = get_plain_sister(args, sister_args)
	end
	
	if not sister and not args.notes and not args.notes_left_content then
		return ''
	end
	
	return tostring(main_div:wikitext(notes_left_content .. (sister or '') .. shortcut .. notes_content))
end

--[=[
Construct header
]=]

function p.construct_header(args)
	local headerContainer = mw.html.create('div'):attr('id', 'headerContainer')
	
	-- header_class from client modules, class from individual uses
	if args.header_class then
		headerContainer:addClass(args.header_class)
	end
	if args.class then
		headerContainer:addClass(args.class)
	end
	
	headerContainer:wikitext(table.concat({
		(args.pre_main or ''),
		construct_main_block(args),
		construct_notes_block(args),
		(args.post_notes or '')
	}))
	
	return p.get_stylesheet('Header structure') .. (args.pre_container or '') .. tostring(headerContainer)
end

function p.header_structure(frame)
	return p.construct_header(getArgs(frame))
end

return p