Module:沙盒
来自Vocawiki
更多操作
local p = {}
-- icon参数转换
local function buildIconUrl(icon)
if not icon or icon == "" then
return nil
end
icon = mw.text.trim(icon)
icon = icon:gsub("[\r\n]", "")
-- 去掉前缀
icon = icon:gsub("^[Ff]ile:", "")
:gsub("^文件:", "")
:gsub("^檔案:", "")
-- 路径或外链直接用
if icon:match("^https?://") or icon:match("^//") or icon:match("^/") then
return icon
end
-- 获取直链
return tostring(mw.uri.fullUrl("Special:FilePath/" .. icon))
end
-- 移除危险字符
local function sanitizeForCssUrl(url)
if not url then return nil end
url = url:gsub("[\r\n]", "")
-- 移除可能破坏 style / url() 的字符
url = url:gsub("[\"'%;%)%(%<%>]", "")
return url
end
function p.main(frame)
local args = frame:getParent().args
local type = args.type or "info"
-- 自定义icon
local iconUrl = buildIconUrl(args.icon)
iconUrl = sanitizeForCssUrl(iconUrl)
-- 拼接style额外片段
local iconStyleExtra = ""
if iconUrl and iconUrl ~= "" then
iconStyleExtra = string.format(" --notice-icon: url(%s);", iconUrl)
end
-- text模式
local textContent = args.text or args[1]
if textContent and textContent ~= "" then
return string.format([[
<div class="notice notice-%s">
<div class="notice-icon" style="-webkit-mask-repeat: no-repeat; -webkit-mask-position: center; -webkit-mask-size: contain;%s"></div>
<div class="notice-text text-base">
<div class="notice-text-only text-base">%s</div>
</div>
</div>
]], type, iconStyleExtra, textContent)
end
-- 列表
local listItems = {}
for i = 1, 50 do
local key = "l" .. i
if args[key] and args[key] ~= "" then
table.insert(listItems, "<li>" .. args[key] .. "</li>")
end
end
local listHtml = ""
if #listItems > 0 then
listHtml = '<ul class="notice-list text-sm">' .. table.concat(listItems, "\n") .. "</ul>"
elseif args.list and args.list ~= "" then
listHtml = '<ul class="notice-list text-sm">' .. args.list .. "</ul>"
end
return string.format([[
<div class="notice notice-%s">
<div class="notice-icon" style="-webkit-mask-repeat: no-repeat; -webkit-mask-position: center; -webkit-mask-size: contain;%s"></div>
<div class="notice-text text-base">
<div class="notice-title text-base">%s</div>
%s
<div class="notice-detail text-sm">%s</div>
</div>
</div>
]], type, iconStyleExtra, args.title or "", listHtml, args.detail or "")
end
return p