模块:GFInfobox
来自OGAS数据中枢
更多操作
此模块的文档可以在Module:GFInfobox/doc创建
local p = {}
local function cleanParam(s)
if not s then return nil end
s = s:gsub('^[%s\n\r\t]+', ''):gsub('[%s\n\r\t]+$', '')
return s ~= '' and s or nil
end
local function processMixedContent(s, frame)
s = cleanParam(s)
if not s then return nil end
s = s:gsub('\n', '<br/>')
return s
end
function p.main(frame)
local args = frame:getParent().args
local html = mw.html.create('div')
:addClass('gf-infobox')
local name = cleanParam(args['标题']) or cleanParam(args['名字']) or mw.title.getCurrentTitle().subpageText
html:tag('div')
:addClass('gf-title')
:wikitext(name)
local image = cleanParam(args['image'])
local imgContainer = html:tag('div'):addClass('gf-image-container')
if image then
imgContainer:wikitext(string.format('[[File:%s|280px|class=infobox-image]]', image))
local imgCaption = cleanParam(args['图片说明'])
if imgCaption then
imgContainer:tag('div')
:css('font-size', '0.9em')
:css('padding', '2px 0')
:wikitext(imgCaption)
end
else
imgContainer:css('padding', '20px 0')
:wikitext('啊嘞?!<br/>这个妹子怎么没有头的样子……')
end
html:tag('div'):addClass('gf-section'):wikitext('基础资料')
local fields = {
{'本名', cleanParam(args['本名'])},
{'别名', processMixedContent(args['别名'], frame)},
{'发色', p.formatHairColor(args, frame)},
{'瞳色', p.formatEyeColor(args, frame)},
{'声优', p.formatVoiceActor(args)},
{'萌点', processMixedContent(args['萌点'], frame)},
{'类型', cleanParam(args['类型'])},
{'稀有度', p.formatRarity(cleanParam(args['稀有度']))},
{'所属团体', cleanParam(args['所属团体'])},
{'个人状态', cleanParam(args['个人状态'])}
}
for _, field in ipairs(fields) do
local label, value = field[1], field[2]
if value then
local row = html:tag('div'):addClass('gf-row')
row:tag('div'):addClass('gf-label'):wikitext(label)
row:tag('div'):addClass('gf-value'):wikitext(value)
end
end
local related = processMixedContent(args['相关人士'], frame)
if related then
html:tag('div'):addClass('gf-section'):wikitext('亲属或相关人')
html:tag('div'):addClass('gf-related'):wikitext(related)
end
return tostring(html)
end
function p.formatHairColor(args, frame)
local v = cleanParam(args['多种发色']) or cleanParam(args['发色'])
if not v then return nil end
return frame:preprocess('{{Hair_color|' .. v .. '}}')
end
function p.formatEyeColor(args, frame)
local v = cleanParam(args['多种瞳色']) or cleanParam(args['瞳色'])
if not v then return nil end
return frame:preprocess('{{Eye_color|' .. v .. '}}')
end
function p.formatVoiceActor(args)
local va = cleanParam(args['多位声优']) or cleanParam(args['声优'])
if not va then return nil end
return string.format('[[%s]]', va)
end
function p.formatRarity(rarity)
if not rarity then return nil end
local rarityColors = {[2]='#777', [3]='#33566f', [4]='#7b813f', [5]='#a7753b', [6]='#ad4229'}
local num = tonumber(rarity)
if not num then
local _, count = rarity:gsub('★', '')
if count > 0 then num = count end
end
if num and rarityColors[math.floor(num)] then
local color = rarityColors[math.floor(num)]
local stars = string.rep('★', math.min(math.max(math.floor(num), 1), 6))
return string.format('<span style="color:%s">%s</span>', color, stars)
end
return rarity
end
return p