モジュール:Infobox改
ナビゲーションに移動
検索に移動
-- https://enpedia.rxy.jp/wiki/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Infobox を大幅に改変したもの
local p = {}
-- @param label: string
-- @param style: string
-- @return string
function toHeaderHTML(label, style)
return '<tr><th colspan="2" style="'..style..'">'..label..'</th></tr>'
end
-- @param onlyLabelTable: { {key: string, style: string} }
-- @return string
function toOnlyLabelHTML(onlyLabelTable)
local result = ''
for i = 1, #onlyLabelTable do
if 0 < #onlyLabelTable[i][1] then
result = result..'<tr><td colspan="2" style="text-align:center;'..onlyLabelTable[i][2]..'">'..onlyLabelTable[i][1]..'</td></tr>'
end
end
return result
end
-- @param label: string
-- @param data: string
-- @param style: string
-- @return string
function toTwinLabelHTML(label, data, labelstyle, datastyle)
return '<tr><th style="width:7em;text-align:left;'..labelstyle..'">'..label..'</th><td style="word-break:break-word;'..datastyle..'">'..data..'</td></tr>'
end
-- @param args: Module:Arguments.getArgsの返り値
-- @return function(...: strings): string
function createArgsGetter(args)
return function(...)
for _, v in pairs({...}) do
if args[v] then return args[v] end
end
return ''
end
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {wrappers = 'Template:Infobox改'})
local argsGetter = createArgsGetter(args)
local result = ''
local bodystyle = 'width:300px;border:1px solid #aaa;background:#fff;float:right;clear:right;margin:0 0 1em 1em;font-size:small;'..(args.bodystyle or '')
titleHTML = ''
if args.title then
local titlestyle = 'font-size:125%;font-weight:bold;'..(args.titlestyle or '')
titleHTML = '<caption style="'..titlestyle..'">'..(args.title or '')..'</caption>'
end
headerHTML = ''
if args.above then
local headerstyle = 'font-size:125%;'..(args.abovestyle or '')
headerHTML = toHeaderHTML(args.above or '', headerstyle)
end
-- 以下 1行項目ら(前)HTML の作成
local imgstyle = args.imagestyle or ''
local capstyle = args.captionstyle or ''
local labelOnlyBeforesHTML = toOnlyLabelHTML({
{argsGetter('subheader', 'subheader1'), argsGetter('subheaderstyle', 'subheaderstyle1')},
{args.subheader2 or '', argsGetter('subheaderstyle', 'subheaderstyle2')},
{argsGetter('image', 'image1'), imgstyle},
{args.image2 or '', imgstyle},
{argsGetter('caption', 'caption1'), capstyle},
{args.caption2 or '', capstyle}
})
-- 以上 1行項目ら(前)HTML の作成
-- 以下 row項目HTML の作成
local rowHTML = ''
local row = args.row or args[1] or ''
local labelstyle = args.labelstyle or ''
local datastyle = args.datastyle or ''
row = row:gsub('^%s+', ''):gsub('%s+$', '') -- 前後の空白を削除 trim
for r in row:gmatch'([^\n]+)\n*' do -- 改行で区切る split
if r:find'^!' then
rowHTML = rowHTML..toHeaderHTML(r:match'^!([^\n]+)' or '', args.headerstyle or '')
else
local label, split, data = r:match'([^\n]+) (-) ([^\n]+)'
if split ~= nil and 0 < #split then
rowHTML = rowHTML..toTwinLabelHTML(label, data, labelstyle, datastyle)
else
label, split = r:match'([^\n]+) (-)'
-- データラベル対指定のラベルがない場合、その行の挿入自体を拒否
rowHTML = rowHTML..toOnlyLabelHTML({{split and '' or r, datastyle}})
end
end
end
-- 以上 row項目HTML の作成
-- 以下 1行項目ら(後)HTML の作成
local labelOnlyAfters = {{args.below or '', args.belowstyle or ''}}
local name = argsGetter('name', 'tnavbar')
if name ~= '' then
local processedName = frame:preprocess('{{Tnavbar|'..name..'|plain=1}}')
table.insert(labelOnlyAfters, {processedName, 'text-align:right;'})
end
local labelOnlyAftersHTML = toOnlyLabelHTML(labelOnlyAfters)
-- 以上 1行項目ら(後)HTML の作成
return '<table class="infobox" style="'..bodystyle..'">'..titleHTML..headerHTML..labelOnlyBeforesHTML..rowHTML..labelOnlyAftersHTML..'</table>'
end
return p