コンテンツにスキップ

このWebサイトは、管理人が個人的に書き留めている備忘録です。それ以上でもそれ以下でもありません。
誤記・誤解・誤謬を含め、記述内容の確度を一切保証しません。責任を負いません。問い合わせ等を受け付けません。
This Mediawiki is a personal memorandum written by Administrator, nothing more, nothing less.
Administrator do NOT guarantee accuracy of content, including any errors, misunderstandings, fallacies, take NO responsibility, do NOT accept inquiries anything of the sort.

モジュール:Navbox/former

提供: Memorandum

このモジュールについての説明文ページを モジュール:Navbox/former/doc に作成できます

local p = {}

--[[
Template:Tnavbar
]]
function p.tnavbar(frame)
	local args = frame.args
	if not args[1] then return ' ' end
	
	local function tf(x)
		return x == '1' and true or false
	end
	args.plain = tf(args.plain)
	args.div = tf(args.div)
	args.nodiv = tf(args.nodiv)
	args.mini = tf(args.mini)
	args.viewplain = tf(args.viewplain)
	if args.miniv == '1' then args.mini, args.viewplain = true, true end
	args.fontstyle = args.fontcolor ~= '' and ((args.fontstyle or '') .. ';color:' .. args.fontcolor .. ';') or args.fontstyle or ''
	
	local r = {open = '<div class="noprint plainlinks navbar hlist" style="white-space:nowrap;font-size:60%;font-weight:normal;', content = '', close = '</div>'} --出力用
	if args.nodiv then
		r.open = r.open .. 'display:inline;padding:0 0.5em;'
	else
		r.open = r.open .. 'background-color:transparent;padding:0;color:#000;'
	end
	r.open = r.open .. args.fontstyle .. (args.style or '') .. '">'
	
	if not (args.plain or args.mini or args.viewplain) then
		r.content = '<span style="font-size:125%;">このテンプレートを:&nbsp;</span>'
	end
	
	local disp = args.mini and {'表', '話', '編', '歴'} or {'表示', 'ノート', '編集', '履歴'}
	local ns = {'Template:', 'Template‐ノート:', 'Template:', 'Template:'}
	local query = {nil, nil, 'action=edit', 'action=history'}
	local title = {'このテンプレートを表示します', 'このテンプレートのノートを表示します', 'このテンプレートを編集します。保存の前にプレビューを忘れずに。', 'このテンプレートの過去の版を表示します'}
	local color = {'', 'color:#002bb8;', 'color:#002bb8;', 'color:#002bb8;'}
	local i = 0
	local i_end = args.viewplain and 1 or 4
	r.content = r.content .. '<ul style="display:inline;">'
	for i = 1, i_end do
		local l = {open = '', link = '', close = ''}
		if query[i] then
			l.open = '['
			l.link = tostring(mw.uri.canonicalUrl(ns[i] .. args[1], query[i])) .. ' '
			l.close = ']'
		else
			l.open = '[['
			l.link = ns[i] .. args[1] .. '|'
			l.close = ']]'
		end
		r.content = r.content .. '<li>' .. l.open .. l.link .. '<span title="' .. title[i] .. '" style="font-size:125%;' .. color[i] .. args.fontstyle .. '">' .. disp[i] .. '</span>' .. l.close
	end
	r.content = r.content .. '</ul>'
	
	return r.open .. r.content .. r.close
end


--[[
Define Arguments
]]
local args = {}
local border
local child, none = false, false
local collapsible = ''
local colspan, rowspan = 0, 0
local basestyle = ''
local odd, even = 'odd', 'even'

local list, liststyle = {}, {}
local group, groupstyle = {}, {}
local colheader, colheadercolspan, colheaderstyle = {}, {}, {}
local col, colstyle, colwidth = {}, {}, {}
local colfooter, colfootercolspan, colfooterstyle = {}, {}, {}
local abbr, state = {}, {}
local sect, section = {}, {}
local secttitlestyle = {}
local content, contentstyle = {}
local image, imageleft = {}, {}

local result = ''	--出力用

local function defArgs(frame)
	args = require('Module:Arguments').getArgs(frame, {parentOnly = true})
	border = args.border or args[1]
	child, none = (border == 'subgroup' or border == 'child'), (border == 'none')
	collapsible = (args.state == 'plain' or args.state == 'off') and '' or 'collapsible '
	colspan = 2 + (args.imageleft and 1 or 0) + (args.image and 1 or 0)
	
	if args.basestyle then basestyle = args.basestyle .. ';' end
	
	local sortable_mt = {
		__lt = function(a, b) return a.index < b.index end,
		__concat = function(a, b)
			local strA = (type(a) == 'table') and a.content or a or ''
			local strB = (type(b) == 'table') and b.content or b or ''
			return strA .. strB
		end
	}
	local function sortable_args(tbl, index, content)
		table.insert(tbl, {index = index, content = content})
		setmetatable(tbl[#tbl], sortable_mt)
	end
	local switch = {
		--common
		list = function(num, v) sortable_args(list, num, '\n' .. v) end,
		liststyle = function(num, v) liststyle[num] = v end,
		group = function(num, v) group[num] = v end,
		groupstyle = function(num, v) groupstyle[num] = v end,
		--for with_columns
		colheader = function(num,v) colheader[num] = v end,
		colheadercolspan = function(num,v) colheadercolspan[num] = v end,
		colheaderstyle = function(num,v) colheaderstyle[num] = v end,
		col = function(num, v) sortable_args(col, num, '\n' .. v) end,
		colstyle = function(num,v) colstyle[num] = v end,
		colwidth = function(num,v) colwidth[num] = v end,
		colfooter = function(num,v) colfooter[num] = v end,
		colfootercolspan = function(num,v) colfootercolspan[num] = v end,
		colfooterstyle = function(num,v) colfooterstyle[num] = v end,
		--for with_collapsible_groups
		abbr = function(num, v) abbr[num] = v end,
		state = function(num, v) state[num] = v end,
		sect = function(num, v) group[num] = v end,
		section = function(num, v) group[num] = v end,
		secttitlestyle = function(num, v) groupstyle[num] = v end,
		content = function(num, v) sortable_args(content, num, '\n' .. v) end,
		contentstyle = function(num, v) liststyle[num] = v end,
		image = function(num, v) image[num] = v end,
		imageleft = function(num, v) imageleft[num] = v end,
	}
	
	for k, v in pairs(args) do
		local str1, num, str2 = string.match(k, '(%D+)(%d+)(%D*)')
		str1, num, str2 = str1 or '', tonumber(num), str2 or ''
		if switch[str1 .. str2] and num then switch[str1 .. str2](num, v) end
	end
	
	table.sort(list)
	rowspan = #list
end

--[[
top
]]
local function top()
	if child then
		result = result .. '</div>'
	elseif not none then
		result = result .. '<table class="navbox" style="border-collapse:collapse;' .. (args.bodystyle or '') .. ';' .. (args.style or '') .. '"><tr><td>'
	end
	
	result = result .. '<table class="nowraplinks ' .. (args.bodyclass or '')
	if args.title then
		result = result .. ' ' .. collapsible .. (args.state or ' autocollapse')
	end
	if child or none then
		result = result .. ' navbox-subgroup" style="margin:-2px;width:100%;width:calc(100% + 4px);' .. (args.bodystyle or '') .. (args.style or '')
	else
		result = result .. '" style="background:transparent;color:inherit;'
	end
	
	result = result .. ';min-width:100%;border-spacing:2px;border-collapse:separate;' .. (args.innerstyle or '') .. '">'
end

--[[
title and navbar
]]
local function title()
	if args.titlegroup then
		result = result .. '<tr><th class="navbox-group ' .. (args.titlegroupclass or '') .. '" style="' .. basestyle  .. (args.groupstyle or '') .. ';' .. (args.titlegroupstyle or '') .. '">' .. args.titlegroup .. '</th><th style="width:100%;'
	else
		result = result .. '<tr><th style="'
	end
	result = result .. basestyle .. (args.titlestyle or '') .. '" colspan=' .. (colspan - (args.titlegroup and 1 or 0)) .. ' class="navbox-title">'
	
	if (args.navbar == 'plain') or (not args.name and (child or none)) then
		result = result .. '<div style="float:left;width:6em;">&nbsp;</div>'
	elseif args.navbar ~= 'off' then
		local tbl = {args = {args.name, mini = '1', fontstyle = basestyle .. (args.titlestyle or '') .. ';border:none;', fontcolor = ''}}
		result = result .. '<div style="float:left;width:6em;text-align:left;">' .. p.tnavbar(tbl) .. '</div>'
	end
	
	if args.titleclass then
		args.titleclass = ' class="' .. args.titleclass .. '"'
	else
		args.titleclass = ''
	end
	result = result .. '<span ' .. args.titleclass .. ' style="font-size:' .. ((child or none) and '100' or '110') .. '%;">' .. args.title .. '</span>'
	
	if args.state == 'plain' then
		result = result .. '<div style="float:right;width:6em;">&nbsp;</div>'
	end
	result = result .. '</th></tr>'
end
	
--[[
above
]]
local function above()
	result = result .. '<tr><td class="navbox-abovebelow ' .. (args.aboveclass or '') .. '" style="' .. basestyle .. (args.abovestyle or '') .. '" colspan=' .. colspan .. '>\n' .. args.above .. '</td></tr>'
end
	
--[[
body
]]
--first group/list and images
local function body1()
	result = result .. '<tr>'
	if args.imageleft then
		result = result .. '<td style="width:0;' .. (args.imageleftstyle or '') .. '" rowspan=' .. rowspan .. '>' .. args.imageleft .. '</td>'
	end
	local j = list[1].index
	if group[j] then
		result = result .. '<th class="navbox-group ' .. (args.groupclass or '') .. '" style="' .. basestyle .. (args.groupwidth and ('width:' .. args.groupwidth .. ';') or '') .. (args.groupstyle or '') .. ';' .. (groupstyle[j] or '') .. '">' .. group[j] .. '</th><td style="text-align:left;'
	else
		result = result .. '<td colspan=2 style="'
	end
	result = result .. (args.groupwidth and '' or 'width:100%;') .. 'padding:0;' .. (args.liststyle or '') .. ';' .. (odd == 'odd' and (args.oddstyle or '') or (args.evenstyle or '')) .. ';' .. (liststyle[j] or '') .. '" class="navbox-list navbox-' .. (args.evenodd == 'swap' and even or args.evenodd or odd) .. ' ' .. (args.listclass or '') .. '"><div style="padding:' .. (args.list1padding or args.listpadding or '0 0.25em') .. '">' .. list[1] .. '\n' .. '</div></td>'
	if args.image then
		result = result .. '<td style="width:0;' .. (args.imagestyle or '') .. '" rowspan=' .. rowspan .. '>' .. args.image .. '</td>'
	end
	result = result .. '</tr>'
end

--remaining groups/lists
local function body2()
	for i = 2, #list do
		odd, even = even, odd
		local j = list[i].index
		if group[j] then
			result = result .. '<tr><th class="navbox-group ' .. (args.groupclass or '') .. '" style="' .. basestyle .. (args.groupwidth and ('width:' .. args.groupwidth .. ';') or '') .. (args.groupstyle or '') .. ';' .. (groupstyle[j] or '') .. '">' .. group[j] .. '</th><td style="text-align:left;'
		else
			result = result .. '<tr><td colspan=2 style="'
		end
		result = result .. (args.groupwidth and '' or 'width:100%;') .. 'padding:0;' .. (args.liststyle or '') .. ';' .. (odd == 'odd' and (args.oddstyle or '') or (args.evenstyle or '')) .. ';' .. (liststyle[j] or '') .. '" class="navbox-list navbox-' .. (args.evenodd == 'swap' and even or args.evenodd or odd) .. ' ' .. (args.listclass or '') .. '"><div style="padding:' .. (args.listpadding or '0 0.25em') .. '">' .. list[i] .. '\n' .. '</div></td></tr>'
	end
end

--[[
below
]]
local function below()
	result = result .. '<tr><td class="navbox-abovebelow ' .. (args.belowclass or '') .. '" style="' .. basestyle .. (args.belowstyle or '') .. '" colspan=' .. colspan .. '>\n' .. args.below .. '</td></tr>'
end
	
--[[
close
]]
local function close()
	result = result .. '</table>'
	
	if child then
		result = result .. '<div>'
	elseif not none then
		result = result .. '</table>'
	end
end

--[[
Template:Navbox
]]
function p.navbox(frame)
	defArgs(frame)
	top()
	if args.title then title() end
	if args.above then above() end
	if list[1] then body1() end
	body2()
	if args.below then below() end
	close()
	return result
end

--[[
Template:Navbox subgroup
]]
function p.subgroup(frame)
	defArgs(frame)
	if not border then child = true end
	args.groupstyle = 'padding:' .. (args.grouppadding or '0 0.75em') .. ';' .. (args.groupstyle or '')
	top()
	if args.title then title() end
	if args.above then above() end
	if list[1] then body1() end
	body2()
	if args.below then below() end
	close()
	return result
end

--[[
Template:Navbox with columns
]]
function p.with_columns(frame)
	defArgs(frame)
	table.sort(col)
	top()
	if args.title then title() end
	if args.above then above() end
	
	if col[1] then
		local j = col[1].index
		local cols = '</div><table class="navbox-columns-table" style="border-spacing:2px;border-collapse:separate;text-align:left;margin:-2px;' .. ((colheader[j] or args.fullwidth) and 'width:100%;width:calc(100% + 4px);' or 'margin:0 auto;') .. (args.coltablestyle or '') .. '">'
		--Header row
		if colheader[j] then
			cols = cols .. '<tr class="navbox-abovebelow" style="font-weight:bold;' .. (args.colheaderstyle or '') .. '">'
			for i = 1, #col do
				local j = col[i].index
				if colheader[j] then
					cols = cols .. '<td colspan=' .. (colheadercolspan[j] or '1') .. ' style="' .. (colheaderstyle[j] or '') .. '">' .. colheader[j] .. '</td>'
				end
			end
			cols = cols .. '</tr>'
		end
		--Main columns
		cols = cols .. '<tr style="vertical-align:top;' .. (args.colstyle or '') .. '">'
		if not (colheader[j] or colfooter[j] or args.fullwidth) then
			local paddingoff = args.padding and string.find(args.padding, '^0[ep]?[mx]?%?;?')
			if not paddingoff then
				cols = cols .. '<td style="width:' .. (args.padding or '5em;') .. '">&nbsp;&nbsp;&nbsp;</td>'
			end
		end
		for i = 1, #col do
			local j = col[i].index
			cols = cols .. '<td style="padding:0;' .. (args.oddcolstyle or '') .. ';' .. (colstyle[j] or '') .. ';width:' .. (colwidth[j] or args.colwidth or '10em;') .. '">' .. col[i] .. '</td>'
			args.oddcolstyle, args.evencolstyle = args.evencolstyle, args.oddcolstyle
		end
		cols = cols .. '</tr>'
		--Footer row
		if colfooter[j] then
			cols = cols .. '<tr class="navbox-abovebelow" style="font-weight:bold;' .. (args.colfooterstyle or '') .. '">'
			for i = 1, #col do
				local j = col[i].index
				if colfooter[j] then
					cols = cols .. '<td colspan=' .. (colfootercolspan[j] or '1') .. ' style="' .. (colfooterstyle[j] or '') .. '">' .. colfooter[j] .. '</td>'
				end
			end
			cols = cols .. '</tr>'
		end
		cols = cols .. '</table><div>'
		table.insert(list, 1, cols)
		rowspan = rowspan + 1
	end
	
	body1()
	body2()
	if args.below then below() end
	close()
	return result
end

--[[
Template:Navbox with collapsible groups
]]
function p.with_collapsible_groups(frame)
	defArgs(frame)
	table.sort(content)
	top()
	if args.title then title() end
	if args.above then above() end
	
	local i = 1
	local function funcList()
		list[i] = list[i] or content[i]
		local j = list[i].index
		collapsible = (state[j] == 'plain' or state[j] == 'off') and '' or 'collapsible '
		args.state = state[j] or args.selected and (args.selected == abbr[j] or args.selected == group[j]) and '' or 'collapsed'
		args.name = nil
		args.titlestyle = basestyle .. (args.groupstyle or '') .. ';' .. (args.secttitlestyle or '') .. ';' .. (groupstyle[j] or '')
		args.liststyle = (args.liststyle or '') .. ';' .. (args.contentstyle or '') .. ';' .. (liststyle[j] or '')
		args.title, group[j] = group[j], nil
		args.image = image[j]
		args.imageleft = imageleft[j]
		colspan = 2 + (args.imageleft and 1 or 0) + (args.image and 1 or 0)
		rowspan = 1
		result = result .. '<td style="' .. (args.groupwidth and '' or 'width:100%;') .. 'padding:0;' .. (args.liststyle or '') .. ';' .. (odd == 'odd' and (args.oddstyle or '') or (args.evenstyle or '')) .. ';' .. (liststyle[j] or '') .. '" class="navbox-list navbox-' .. (args.evenodd == 'swap' and even or args.evenodd or odd) .. ' ' .. (args.listclass or '') .. '"><div>'
		if args.title then
			none = true
			top()
			title()
			body1()
			close()
		else
			result = result .. (list[i] or '')
		end
		result = result .. '</div></td></tr>'
	end
	
	--i = 1
	result = result .. '<tr>'
	if args.imageleft then
		result = result .. '<td style="width:0;padding:0 2px 0 0;' .. (args.imageleftstyle or '') .. '" rowspan=' .. rowspan .. '>' .. args.imageleft .. '</td>'
	end
	funcList()
	if args.image then
		result = result .. '<td style="width:0%;padding:0 0 0 2px;' .. (args.imagestyle or '') .. '" rowspan=' .. rowspan .. '>' .. args.image .. '</td>'
	end
	--i > 2
	for i = 2, #list do
		result = result .. '<tr>'
		list[1] = list[i]
		funcList()
	end
	
	if args.below then below() end
	child, none = (border == 'subgroup' or border == 'child'), (border == 'none') --再定義
	close()
	return result
end

--[[
Template:NavboxYears
Template:NavboxYears2
]]
local function calc_years(args, fmtLink)
	local numtab = tonumber(args.tab) or 0
	local numstart = tonumber(args.start)
	local numend = tonumber(args['end'])
	local numstep = tonumber(args.step) or 1
	if numstart and numend then
		if numtab > 0 then
			for i = 2, numtab + 1 do
				args[i] = nil
			end
		end
		local numD = numend - numstart + 1
		for i = 1, numD, numstep do
			args[i + numtab + 1] = numstart + i - 1
		end
	end
	local result = '<table style="width:100%;border-spacing:2px;border-collapse:separate;text-align:center;">' 
	local h = 1
	repeat
		h = h + 1
		result = result .. '<tr>'
		for i = 2, 11 do
			result = result .. '<td style="width:10%;">'
			if (tonumber(args[i]) or -1) > 0 then
				result = result .. ('[[' .. fmtLink(args[1], args[i]) .. '|' .. args[i] .. ']]')
			else
				result = result .. (args[i] or '')
			end
			result = result .. '</td>'
			args[i], args[i + 10] = args[i + 10], args[i + h * 10]
		end
		result = result .. '</tr>'
	until not args[2]
	result = result .. '</table>'
	return result
end

local function years(frame, fmtLink)
	defArgs(frame)
	if args.var then fmtLink = function(str, num) return str:gsub(args.var, num) end end
	if args.name then
		args.style = 'width:' .. (args.width or '38em') .. ';' .. (args.style or '')
		top()
		if args.title then title() end
		if args.above then above() end
		if not list[1] and args[1] then list[1] = calc_years(args, fmtLink) end
		if list[1] then body1() end
		body2()
		if args.below then below() end
		close()
		return result
	else
		return calc_years(args, fmtLink)
	end
end

function p.years(frame)
	local fmtLink = function(str, num) return str .. num end
	return years(frame, fmtLink)
end

function p.years2(frame)
	local fmtLink = function(str, num) return num .. str end
	return years(frame, fmtLink)
end

return p