Module:L
来自音MAD维基
此模块使用Lua语言: |
本模板用于生成常见平台的作品链接。受 Cookie☆Wiki 同名模板启发。
基本用法
{{L|作品号|作品标题(可不填)|p=分P数(可不填)|状态=作品状态(可不填)}}
目前支持的作品号有:av/BV/cv/au/ep/ss/sm/au/cv/ep/ss/ml/rl/nm/ac/pid/im/uid
另外,本站最常使用av号、BV号和sm号可以直接用模板 {{av}}、{{BV}}、{{sm}} 来代替,无需使用本模板,用法参见常见模板速查,其它参数与本模板一致。
YouTube 链接请直接使用超链接表示或者用模板 {{ytb}} 来生成。
显示视频状态
状态
参数可以比较直观的显示出视频的留存状态,若视频被删除则需要加上此参数。可用的参数值有失效/删除/削除/非公开/分p删除/分p削除/分p失效
。其实效果都是差不多的。此外还有禁止转载
参数。应该没什么用。
- 示例:
- 表示失效视频:
{{L|av1|状态=失效}}
- 效果:
av1
原视频与搬运补档
使用 origin
和 archive
参数可以分别在模板中保留作品链接的原地址或者补档地址。
- 若使用了
archive
参数,则状态
参数无效,并且链接会变成搬运/补档的地址,目前archive
参数支持使用链接和作品号。
特殊用法:设定archive=biliplus
可以将av号和BV号链接转换为 BiliPlus 对应页面的链接。 - 若使用了
origin
参数,则链接不会有变化,只会在提示信息中额外标注。目前origin
参数只支持作品号。 - 两个参数不应同时使用。
当然,可以不必纠结哪个作品号为原视频哪个作品号为搬运,无需特地使用这两个参数,作者名标记正确即可。
示例:
- 搬运地址:
{{L|sm19158004|archive=av9912788}}
效果:sm19158004转
- 原地址:
{{L|av9912788|origin=sm19158004}}
效果:av9912788
生成纯链接
若有时需要与某些模板搭配,想要生成单纯的完整链接,则需要加上 pl=y
参数,这样模板会输出整段链接。
- 示例
{{L|av114514|pl=y}}
- 将会生成:https://www.bilibili.com/video/av114514
注意:此参数会导致其他参数失效(作品号参数除外),因此添加此参数时可以将其他参数移除。
贡献
在向本模板添加新的内容或链接前,你需要先了解相应的 URL 规则。
若要添加新类型的作品号链接却不知道如何编辑本模板,可在本模板讨论页中提出要添加的链接。
local L = {}
local getArgs = require("Module:Arguments").getArgs
local isInArray = require("Module:Utils").isInArray
local yesno = require("Module:Yesno")
local linksTable = require("Module:L/Data")
-- local mw = mw or {}
function L.paramTable(part, time)
return { ["p"] = part, ["t"] = time }
end
function L.parseParam(paramTable)
local formatedText = {}
local spliter = "?"
for k, v in pairs(paramTable) do
spliter = #formatedText == 0 and "?" or "&"
-- mw.log(k, v)
if #v > 0 then
table.insert(formatedText, spliter .. mw.text.nowiki(k .. "=" .. v))
end
end
return table.concat(formatedText, "")
end
function L.statusTable(titleText, text, partText, category)
-- TODO 使用mediawiki自带模块处理html
return {
normal = { "", "<span title='" .. titleText .. "'>" .. text .. partText .. "</span>", "" },
invalidLink = {
category .. "<span class='plainlinks'>",
"<span title='" .. titleText .. "' style='color:grey'><s>" .. text .. partText .. "</s></span>",
"</span>",
},
invalidPart = {
category,
"<span title='" .. titleText .. "'>" .. text .. "<span style='color:grey'><s>" .. partText .. "</s></span>",
"",
},
reproduceProhibited = {
"",
"<span title='" .. titleText .. "'>" .. text .. partText .. "</span>",
"<span style='color:red'><small>(禁止转载)</small></span>",
},
}
end
function L.parseStatus(statusTable, status)
local formatedText
if isInArray(status, { "失效", "删除", "削除", "非公开" }) then
formatedText = statusTable.invalidLink
elseif isInArray(status, { "分p失效", "分p删除", "分p削除" }) then
formatedText = statusTable.invalidPart
elseif status == "禁止转载" then
formatedText = statusTable.reproduceProhibited
else
formatedText = statusTable.normal
end
return formatedText
end
function L.titleText(archive, id, status)
if archive then
return "原视频号为 " .. id
end
return status and "此作品目前处于" .. status .. "状态。" or id
end
function L.genLink(prefixToLink, params, id)
local prefix = prefixToLink[id:sub(1, 3):lower()] and id:sub(1, 3):lower() or id:sub(1, 2):lower()
local digit = id:sub(#prefix + 1)
if not prefixToLink[prefix] then
return id
end
local link = linksTable[prefix] .. digit .. params
return link
end
function L.generate(frame)
--[=[
生成特定号码对应链接的模块
@param 第一个参数,默认的视频号,会被archive参数覆盖
@param 第二个参数,默认的显示文本,为空时被第一个参数或archive参数覆盖
@param status 状态
@param p 分p号
@param t 时间号
@param archive 搬运地址或者视频号
@param option 样式的设置
@return html
--]=]
local args = getArgs(frame)
local id = args[1]
local pl = yesno(args["pl"])
-- 链接参数处理
local timeStr = args["t"] or "" -- TODO 播放时间点解析器
local partNum = args["p"] and tonumber(args["p"]) or 1
local partStr = partNum > 1 and args["p"] or ""
local params = L.parseParam(L.paramTable(partStr, timeStr))
-- 生成链接
local link = L.genLink(linksTable, params, id)
local pureOutput = link
if pl then
return pureOutput
end
-- html生成参数处理
local text = args[2] or id
local archive = args["archive"] or args["转载"] or args["补档"]
local status = args["status"] or args["状态"]
local option = args["option"]
-- 生成html文本
local category = option ~= "nocategory" and "[[分类:有失效链接的页面]]" or "" -- TODO 选项解析器
local partText = (partNum > 1 and "<sup>第" .. partStr .. "P</sup>") or ""
local titleText = L.titleText(archive, id, status)
local formatter = L.parseStatus(L.statusTable(titleText, text, partText, category), status)
local formattedOutput = ("%s[" .. link .. "%s]%s"):format(unpack(formatter))
if archive then
return formattedOutput .. '<span class="repost-circle">[' .. L.genLink(linksTable, "", archive) .. " 转]</span>"
end
return formattedOutput
end
return L