モジュール:Navbox/former
< モジュール:Navbox2017年11月5日 (日) 00:27時点におけるWaiesu (トーク)による版 (Module:Navbox/former/sandboxより全文転記、Template‐ノート:Navboxでの議論に基づく)
このモジュールについての説明文ページを モジュール: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%;">このテンプレートを: </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 = mw.uri.decode(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><td class="navbox-group ' .. (args.titlegroupclass or '') .. '" style="' .. basestyle .. (args.groupstyle or '') .. ';' .. (args.titlegroupstyle or '') .. '">' .. args.titlegroup .. '</td><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;"> </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;"> </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 .. '<td class="navbox-group ' .. (args.groupclass or '') .. '" style="' .. basestyle .. (args.groupwidth and ('width:' .. args.groupwidth .. ';') or '') .. (args.groupstyle or '') .. ';' .. (groupstyle[j] or '') .. '">' .. group[j] .. '</td><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] .. '</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><td class="navbox-group ' .. (args.groupclass or '') .. '" style="' .. basestyle .. (args.groupwidth and ('width:' .. args.groupwidth .. ';') or '') .. (args.groupstyle or '') .. ';' .. (groupstyle[j] or '') .. '">' .. group[j] .. '</td><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] .. '</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;') .. '"> </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