Jump to content

Module:Military navigation

Permanently protected module
From Wikipedia, the free encyclopedia

local p = { }

local Navbox = require('Module:Navbox')
local inArray = require("Module:TableTools").inArray
local Styles = mw.loadData('Module:WPMILHIST Infobox style')
local cfg = mw.loadData('Module:Navbox/configuration')


local function isblank(s)
	return (not s) or s == ''
end
local function ifnotblank(s,pre,t)
	return (s and s ~= '') and (pre..s) or t
end

function p._main(args)
    local tcats = ''

	-- process bodystyle and titlestyle
	if args.style == 'wide' then
		args['titlestyle'] = Styles['nav_box_wide_header']
		args['bodystyle'] = Styles['nav_box_wide']
	else
		args['titlestyle'] = Styles['nav_box_header']
		if args.border == cfg.keyword.border_child or args.border == cfg.keyword.border_subgroup then
			args['bodystyle'] = Styles['nav_box_child']
			tcats = tcats .. '[[Category:Pages using military navigation subgroups without wide style]]'
		else
			args['bodystyle'] = Styles['nav_box']
		end
	end

	-- process groupstyle, abovestyle, belowstyle
	args['groupstyle'] = Styles['nav_box_label'] .. (args['groupstyle'] or '')
	args['abovestyle'] = Styles['nav_box_label'] .. (args['abovestyle'] or '')
	args['belowstyle'] = Styles['nav_box_label'] .. (args['belowstyle'] or '')
	-- process oddstyle, evenstyle
	args['oddstyle'] = ifnotblank(args['odd_color'],'background:',nil)
	args['evenstyle'] = ifnotblank(args['even_color'],'background:',nil)
	-- process name and rawname
	args['name'] = ifnotblank(args['name'],'',args['rawname'])
	if isblank(args['name']) then args['navbar'] = 'plain' end
	
	-- process subgroups
	for k, v in pairs(args) do
		local listnum = tostring(k):match(cfg.pattern.listnum)
		if listnum and inArray(cfg.keyword.subgroups, v) then
			local subArgs = {
				[cfg.arg.border] = cfg.keyword.border_subgroup,
				[cfg.arg.navbar] = cfg.keyword.navbar_plain,
				style            = args.style
			}
			local hasSubArgs = false
			for kk, vv in pairs(args) do
				kk = tostring(kk)
				for _, vvv in ipairs(cfg.arg.subgroups_and_num) do
					vvv = string.format(vvv, listnum) .. "_"
					if (#kk > #vvv) and (kk:sub(1, #vvv) == vvv) then
						subArgs[kk:sub(#vvv + 1)] = vv
						hasSubArgs = true
					end
				end
			end
			args[k] = hasSubArgs and p._main(subArgs) or v
		end
	end
	
	-- add allow wrap
	if args['title'] and args.style ~= 'wide' then
		if not mw.ustring.match(args['title'], '<span class="wrap">') then
			-- probably a more efficient way to match 15 or more characters
			local m = '[^%[%]<>|][^%[%]<>|][^%[%]<>|][^%[%]<>|][^%[%]<>|]'
			m = m .. m .. m
			args['title'] = mw.ustring.gsub(args['title'], 
				'%[%[(' .. m .. '[^%[%]<>|]*)%]%]', 
				'[[%1|<span class="wrap">%1</span>]]')
			args['title'] = mw.ustring.gsub(args['title'], 
				'%[%[([^%[%]<>|]*)|(' .. m .. '[^%[%]<>|]*)%]%]', 
				'[[%1|<span class="wrap">%2</span>]]')
		end
	end
	
	-- add navbox-vertical for non-wide format
	if args.style ~= 'wide' then
		args['bodyclass'] = 'navbox-vertical' .. (args['bodyclass'] and (' ' .. args['bodyclass']) or '')
	end

	--fallback to "battles" for "list1" for compatibility with [[Template:Campaignbox]]
	if isblank(args['list1']) and not isblank(args.battles) then
		args['list1'] = args.battles
	end
	
    return tcats .. Navbox._navbox(args)
end 

function p.main(frame)
    local args = { }
    local pargs = frame:getParent().args
	local fargs = frame.args

    for k, v in pairs(pargs) do
        if v and v ~= '' then
			args[k] = v
        end
    end
    for k, v in pairs(fargs) do
        if v and v ~= '' then
            args[k] = v
        end
    end
	return p._main(args)
end

return p