bugfix20250107.1

全站通知:

模块:玩家装饰

来自卡拉彼丘WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

此模块的文档可以在模块:玩家装饰/doc创建

local p = {}
local strinova = require("模块:卡拉彼丘")
local qualityToColor = strinova.qualityToColor
local format = string.format

-- ================= 辅助函数 =================
--稀有度样式
local function rarity_tag(frame, quality, name)
	local color = qualityToColor[quality]
	return format('<span class="badge rounded-pill" style="background-color: %s;">%s</span>', color, name)
end

-- 通用样式
local function build_style(frame, name, quality, get, desc, file)
	return "File:"..file.."::"
		..rarity_tag(frame, quality, name).."::"
		..desc.."::"
		..get
end

-- 超弦体动作样式
local function build_role_action_style(frame, name, quality, get, desc, file)
	local info = frame:callParserFunction { name = '#info', args = { '[[文件:'..name..'.gif]]', 'max-width=500' } }
	return "File:"..file.."::"
		..rarity_tag(frame, quality, name)..info.."::"
		..desc.."::"
		..get
end

-- 意识重构样式
local function build_lottery_style(frame, file, name, quality)
	local html = file.."|"..rarity_tag(frame, quality, name)
	return tostring(html)
end

-- 通用生成 GalleryGrid 参数的函数
-- @param data: 数据表
-- @param filterStr: 过滤关键词 (可选)
-- @param options: 配置项 (width, height, fit, filePattern, styleFunc)
local function generate_gallery_args(frame, data, filterStr, options)
	local args = {
		template = 'PlayerDecoration',
		class = 'player-decoration',
		widths = options.widths or nil,
		heights = options.heights or nil,
	}

	-- 默认为标准样式构建函数
	local styleFunc = options.styleFunc or build_style

	for _, items in pairs(data) do
		local match = true
		if filterStr and filterStr ~= "" then
			-- 如果有过滤词,则检查 get 字段
			if not (items.get and string.find(items.get, filterStr, 1, true)) then
				match = false
			end
		end

		if match then
			-- 处理文件名:优先使用传入的 pattern 格式化,否则使用 items.file
			local file = items.file
			if options.filePattern and items.id then
				file = format(options.filePattern, items.id)
			end

			local entry = styleFunc(frame, items.name, items.quality, items.get, items.desc, file)
			table.insert(args, entry)
		end
	end
	return args
end

--================= 主要函数 =================
p["封装"] = function (frame)
	local data = mw.loadData("模块:玩家装饰/FrameData")
	local args = generate_gallery_args(frame, data, nil, {
		heights = '250px',
	})
	return frame:expandTemplate { title = 'gallerygrid', args = args }
end

p["基板页面"] = function (frame)
	local data = mw.loadData("模块:玩家装饰/IDCardData")
	local args = generate_gallery_args(frame, data, frame.args[1], {
	})
	return frame:expandTemplate { title = 'gallerygrid', args = args }
end

p["喷漆页面"] = function (frame)
	local data = mw.loadData("模块:玩家装饰/DecalData")
	local args = generate_gallery_args(frame, data, frame.args[1], {
		filePattern = '喷漆_%d.png',
	})
	return frame:expandTemplate { title = 'gallerygrid', args = args }
end

p["勋章页面"] = function (frame)
	local data = mw.loadData("模块:玩家装饰/BadgeData")
	local args = generate_gallery_args(frame, data, frame.args[1], {
	})
	return frame:expandTemplate { title = 'gallerygrid', args = args }
end

p["聊天气泡"] = function (frame)
	local data = mw.loadData("模块:玩家装饰/ChatBubblesData")
	local args = generate_gallery_args(frame, data, nil, {
		filePattern = '聊天气泡_%d.png',
	})
	return frame:expandTemplate { title = 'gallerygrid', args = args }
end

p["头套"] = function (frame)
	local data = mw.loadData("模块:玩家装饰/MascotHeadData")
	local args = generate_gallery_args(frame, data, nil, {
		filePattern = '头套_%d.png',
	})
	return frame:expandTemplate { title = 'gallerygrid', args = args }
end

p["超弦体动作"] = function (frame)
	local data = mw.loadData("模块:玩家装饰/RoleActionData")
	local args = generate_gallery_args(frame, data, nil, {
		filePattern = '超弦体动作图标_%d.png',
		styleFunc = build_role_action_style,  -- 使用自定义样式函数
	})
	return frame:expandTemplate { title = 'gallerygrid', args = args }
end

------ 大图子页面 ------
p["基板大图"] = function (frame)
	local data = mw.loadData("模块:玩家装饰/IDCardData")
	local filter = frame.args[1]
	local resultList = {}

	for _, items in pairs(data) do
		if string.find(items.get, filter, 1, true) then
			local html = format("%s|'''<big>%s</big>'''", items.img, items.name)
			table.insert(resultList, html)
		end
	end

	return frame:preprocess('<gallery mode="nolines" widths=140px heights=340px>\n'..table.concat(resultList, "\n")..'\n</gallery>')
end

p["喷漆大图"] = function (frame)
	local data = mw.loadData("模块:玩家装饰/DecalData")
	local get = frame.args[1]
	local resultList = {}

	for _, items in pairs(data) do
		if string.find(items.get, get, 1, true) then
			local file = format('喷漆_L_%d.png', items.id)
			local html = format("%s|'''<big>%s</big>'''", file, items.name)
			table.insert(resultList, html)
		end
	end
	local result = table.concat(resultList, "\n")
	return frame:preprocess('<gallery mode="nolines" widths=200px heights=200px>\n'..result..'\n</gallery>')
end


-- 意识重构样式处理
local function get_lottery_css(frame)
	return frame:callParserFunction {
		name = '#css',
		args = { '.gallerytext .badge {vertical-align: baseline;font-size: large;white-space: normal;}' },
	}
end

p["意识重构基板"] = function (frame)
	local data = mw.loadData("模块:玩家装饰/IDCardData")
	local get = frame.args[1]
	local resultList = {}

	for _, items in pairs(data) do
		if string.find(items.get, get, 1, true) then
			local html = build_lottery_style(frame, items.file, items.name, items.quality)
			table.insert(resultList, html)
		end
	end

	local css = get_lottery_css(frame)
	return css..frame:preprocess('<gallery mode="packed">\n'..table.concat(resultList, "\n")..'\n</gallery>')
end

------意识重构页喷漆
p["意识重构喷漆"] = function (frame)
	local data = mw.loadData("模块:玩家装饰/DecalData")
	local get = frame.args[1]
	local resultList = {}

	for _, items in pairs(data) do
		if string.find(items.get, get, 1, true) then
			local file = format('喷漆_%d.png', items.id)
			local html = build_lottery_style(frame, file, items.name, items.quality)
			table.insert(resultList, html)
		end
	end

	local css = get_lottery_css(frame)
	return css..frame:preprocess('<gallery mode="packed">\n'..table.concat(resultList, "\n")..'\n</gallery>')
end

------弦海寻宝页喷漆
p["弦海寻宝勋章"] = function (frame)
	local data = mw.loadData("模块:玩家装饰/BadgeData")
	local get = frame.args[1]
	local resultList = {}

	for _, items in pairs(data) do
		if string.find(items.get, get, 1, true) then
			local html = build_lottery_style(frame, items.file, items.name, items.quality)
			table.insert(resultList, html)
		end
	end
	local css = get_lottery_css(frame)
	return css..frame:preprocess('<gallery mode="packed">\n'..table.concat(resultList, "\n")..'\n</gallery>')
end

return p