打开/关闭搜索
搜索
打开/关闭菜单
14
6665
42
1.1万
OGAS数据中枢
导航
首页
最近更改
随机页面
特殊页面
上传文件
少女前线
简介
战术人形
装备图鉴
BGM
任务
打开/关闭外观设置菜单
通知
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。
user-interface-preferences
个人工具
注册
登录
查看“︁Module:少女前线信息”︁的源代码
来自OGAS数据中枢
更多操作
←
Module:少女前线信息
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
管理员
您可以查看和复制此页面的源代码。
-- Module:少女前线信息 -- 负责解析模板参数,输出信息框HTML结构 local p = {} -- type=pic 时的固定差分名称 local PIC_NAMES = { '普通', '重创', '和谐', '重创和谐' } -- 右侧信息字段定义 { 参数名, 显示标签 } local INFO_FIELDS = { { 'tagline', '标题' }, { '本名', '本名' }, { '发色', '发色' }, { '瞳色', '瞳色' }, { '声优', '声优' }, { '人设', '人设' }, { '类型', '类型' }, { '稀有度', '稀有度' }, { '归属部门', '归属部门' }, { '归属组织', '归属组织' }, { '个人状态', '个人状态' }, } -- 底部额外字段 local BOTTOM_FIELDS = { { '别名', '别名' }, { '萌点', '萌点' }, { '相关人士', '亲属/相关人士' }, } -- HTML转义 local function escape(s) if not s then return '' end return s:gsub('&','&'):gsub('<','<'):gsub('>','>'):gsub('"','"') end -- 解析所有立绘组 local function parseGroups(args) local groups = {} for i = 1, 30 do local tag = args['tag' .. i] if not tag or tag == '' then -- 跳过空tag但继续,允许不连续(保险起见最多扫30个) -- 若连续3个都空则停止 if i > 3 then local allEmpty = true for k = i, math.min(i+2, 30) do if args['tag'..k] and args['tag'..k] ~= '' then allEmpty = false; break end end if allEmpty then break end end else local groupType = args['type' .. i] or 'pic' local pics = {} for j = 1, 20 do local picFile = args['tag' .. i .. 'pic' .. j] if picFile and picFile ~= '' then local label if groupType == 'pic' then label = PIC_NAMES[j] or ('差分' .. j) else label = args['tag' .. i .. 'name' .. j] if not label or label == '' then label = '差分' .. j end end table.insert(pics, { file = picFile, label = label }) end end table.insert(groups, { label = tag, groupType = groupType, pics = pics, }) end end return groups end -- 渲染switcher按钮列表 local function renderSwitcher(groups) local html = {} table.insert(html, '<div class="gf-switcher-overlay">') table.insert(html, '<div class="gf-switcher-toggle" title="展开/隐藏菜单"></div>') table.insert(html, '<div class="gf-switcher-list">') for gi, group in ipairs(groups) do local isFirst = gi == 1 -- 一级按钮 table.insert(html, string.format( '<div class="gf-group-btn%s" data-group="%d">%s</div>', isFirst and ' active' or '', gi, escape(group.label) )) -- 二级差分列表 table.insert(html, string.format( '<div class="gf-variant-list%s" data-group="%d">', isFirst and '' or ' collapsed', gi )) for vi, pic in ipairs(group.pics) do local isFirstPic = vi == 1 table.insert(html, string.format( '<div class="gf-switch-btn%s" data-group="%d" data-variant="%d" data-filename="%s">%s</div>', isFirst and isFirstPic and ' active' or '', gi, vi, escape(pic.file), escape(pic.label) )) end table.insert(html, '</div>') -- gf-variant-list end table.insert(html, '</div>') -- gf-switcher-list table.insert(html, '</div>') -- gf-switcher-overlay return table.concat(html, '\n') end -- 渲染图片容器 local function renderImageContainer(groups) local html = {} table.insert(html, '<div class="gf-image-container">') -- 默认显示第一组第一张 local defaultFile = '' if groups[1] and groups[1].pics[1] then defaultFile = groups[1].pics[1].file end if defaultFile ~= '' then table.insert(html, string.format( '<div class="gf-main-img">[[File:%s|link=]]</div>', defaultFile )) end table.insert(html, '<div class="gf-view-original" title="查看原图"></div>') table.insert(html, '</div>') -- gf-image-container return table.concat(html, '\n') end -- 渲染右侧信息表格 local function renderInfoTable(args, pageName) local html = {} -- 标题行:优先 名字 > tagline > 页面名 local title = args['名字'] or args['tagline'] or pageName or '' table.insert(html, '<div class="gf-right-panel">') table.insert(html, '<table class="gf-info-table">') table.insert(html, string.format( '<tr><th colspan="2" class="gf-header-row">%s</th></tr>', escape(title) )) for _, field in ipairs(INFO_FIELDS) do local val = args[field[1]] if val and val ~= '' then table.insert(html, string.format( '<tr><td class="gf-label">%s</td><td>%s</td></tr>', escape(field[2]), val -- 不转义,允许wikitext链接等内容由frame处理 )) end end table.insert(html, '</table>') table.insert(html, '</div>') -- gf-right-panel return table.concat(html, '\n') end -- 渲染底部表格 local function renderBottomSection(args) local rows = {} for _, field in ipairs(BOTTOM_FIELDS) do local val = args[field[1]] if val and val ~= '' then table.insert(rows, string.format( '<tr><td class="gf-label">%s</td><td>%s</td></tr>', escape(field[2]), val )) end end if #rows == 0 then return '' end local html = {} table.insert(html, '<div class="gf-bottom-section">') table.insert(html, '<table class="gf-bottom-table">') for _, row in ipairs(rows) do table.insert(html, row) end table.insert(html, '</table>') table.insert(html, '</div>') return table.concat(html, '\n') end -- Cargo存储(如需启用,取消注释并补充表名/字段) --[[ local function storeCargo(frame, args) -- 示例: -- frame:callParserFunction('#cargo_store', { -- _table = 'GF_Characters', -- 名字 = args['名字'] or '', -- 声优 = args['声优'] or '', -- 类型 = args['类型'] or '', -- }) end ]] -- 主入口 function p.main(frame) local args = frame:getParent().args local pageName = mw.title.getCurrentTitle().subpageText local groups = parseGroups(args) -- 唯一ID,支持同页面多个信息框 local boxId = 'gf-box-' .. mw.uri.encode(pageName, 'PATH') .. '-' .. tostring(os.clock()):gsub('%.','') local html = {} table.insert(html, string.format('<div class="gf-infobox-new" id="%s">', escape(boxId))) -- 左侧立绘区 table.insert(html, '<div class="gf-left-panel">') if #groups > 0 then table.insert(html, renderSwitcher(groups)) table.insert(html, renderImageContainer(groups)) end table.insert(html, '</div>') -- gf-left-panel -- 右侧信息区 table.insert(html, renderInfoTable(args, pageName)) table.insert(html, '</div>') -- gf-infobox-new -- 底部区 table.insert(html, renderBottomSection(args)) -- storeCargo(frame, args) return frame:preprocess(table.concat(html, '\n')) end return p
该页面嵌入的页面:
Module:少女前线信息/doc
(
查看源代码
)
返回
Module:少女前线信息
。
查看“︁Module:少女前线信息”︁的源代码
来自OGAS数据中枢