文档图示 模块文档

本模块用于执行三个用户框模板:{{userbox}}、{{userbox-2}}、{{userbox-r}}。

模板描述示例
{{userbox}}生成左边带 id 区或没有 id 区的用户框。
{{userbox-2}}生成左右两边都有 id 区的用户框。
{{userbox-r}}生成右边带 id 区的用户框。

为使用这些模板,请参阅各自模板的说明。为直接用 Lua 生成用户框,请看:

以 Lua 生成用户框

为直接用 Lua 生成用户框,先载入模块:

local userbox = require('Module:Userbox')

然后您可用以下代码运行任意三个模板:

userbox.main(functionName, args)

对于 {{userbox}} 使用函数名 _userbox;对于 {{userbox-2}} 使用函数名 _userbox-2;对于 {{userbox-r}} 使用函数名 _userbox-r。参数 args 用于处理不同用户框功能,请参阅各自模板说明。

-- This module implements {{userbox}}.local categoryHandler = require('Module:Category handler').mainlocal p = {}---------------------------------------------------------------------------------- Helper functions--------------------------------------------------------------------------------local function checkNum(val, default)-- Checks whether a value is a number greater than or equal to zero. If so,-- returns it as a number. If not, returns a default value.val = tonumber(val)if val and val >= 0 thenreturn valelsereturn defaultendendlocal function addSuffix(num, suffix)-- Turns a number into a string and adds a suffix.if num thenreturn tostring(num) .. suffixelsereturn nilendendlocal function checkNumAndAddSuffix(num, default, suffix)-- Checks a value with checkNum and adds a suffix.num = checkNum(num, default)return addSuffix(num, suffix)endlocal function makeCat(cat, sort)-- Makes a category link.if sort thenreturn mw.ustring.format('[[Category:%s|%s]]', cat, sort)elsereturn mw.ustring.format('[[Category:%s]]', cat)endend---------------------------------------------------------------------------------- Argument processing--------------------------------------------------------------------------------local function makeInvokeFunc(funcName)return function (frame)local origArgs = require('Module:Arguments').getArgs(frame)local args = {}for k, v in pairs(origArgs) doargs[k] = vendreturn p.main(funcName, args)endendp.userbox = makeInvokeFunc('_userbox')p['userbox-2'] = makeInvokeFunc('_userbox-2')p['userbox-r'] = makeInvokeFunc('_userbox-r')---------------------------------------------------------------------------------- Main functions--------------------------------------------------------------------------------function p.main(funcName, args)local userboxData = p[funcName](args)local userbox = p.render(userboxData)local cats = p.categories(args)return userbox .. (cats or '')endfunction p._userbox(args)-- Does argument processing for {{userbox}}.local data = {}-- Get div tag values.data.float = args.float or 'left'local borderWidthNum = checkNum(args['border-width'] or args['border-s'], 1) -- Used to calculate width.data.borderWidth = addSuffix(borderWidthNum, 'px')data.borderColor = args['border-color'] or args[1] or args['border-c'] or args['id-c'] or '#999'data.width = addSuffix(240 - 2 * borderWidthNum, 'px') -- Also used in the table tag.data.bodyClass = args.bodyclass-- Get table tag values.data.backgroundColor = args['info-background'] or args[2] or args['info-c'] or '#eee'-- Get info values.data.info = args.info or args[4] or "<code>{{{info}}}</code>"data.infoTextAlign = args['info-a'] or 'left'data.infoFontSize = checkNumAndAddSuffix(args['info-size'] or args['info-s'], 8, 'pt')data.infoHeight = checkNumAndAddSuffix(args['logo-height'] or args['id-h'], 45, 'px')data.infoPadding = args['info-padding'] or args['info-p'] or '0 4px 0 4px'data.infoLineHeight = args['info-line-height'] or args['info-lh'] or '1.25em'data.infoColor = args['info-color'] or args['info-fc'] or 'black'data.infoOtherParams = args['info-other-param'] or args['info-op']data.infoClass = args['info-class']-- Get id values.local id = args.logo or args[3] or args.iddata.id = iddata.showId = id and true or falsedata.idWidth = checkNumAndAddSuffix(args['logo-width'] or args['id-w'], 45, 'px')data.idHeight = checkNumAndAddSuffix(args['logo-height'] or args['id-h'], 45, 'px')data.idBackgroundColor = args['logo-background'] or args[1] or args['id-c'] or '#ddd'data.idTextAlign = args['id-a'] or 'center'data.idFontSize = checkNumAndAddSuffix(args['logo-size'] or args[5] or args['id-s'], 14, 'pt')data.idColor = args['logo-color'] or args['id-fc'] or data.infoColordata.idPadding = args['logo-padding'] or args['id-p'] or '0 1px 0 0'data.idLineHeight = args['logo-line-height'] or args['id-lh'] or '1.25em'data.idOtherParams = args['logo-other-param'] or args['id-op']data.idClass = args['id-class']return dataendp['_userbox-2'] = function (args)-- Does argument processing for {{userbox-2}}.local data = {}-- Get div tag values.data.float = args.float or 'left'local borderWidthNum = checkNum(args[9] or args['border-s'], 1) -- Used to calculate width.data.borderWidth = addSuffix(borderWidthNum, 'px')data.borderColor = args[1] or args['border-c'] or args['id1-c'] or '#999999'data.width = addSuffix(240 - 2 * borderWidthNum, 'px') -- Also used in the table tag.data.bodyClass = args.bodyclass-- Get table tag values.data.backgroundColor = args[2] or args['info-c'] or '#eeeeee'-- Get info values.data.info = args[4] or args.info or "<code>{{{info}}}</code>"data.infoTextAlign = args['info-a'] or 'left'data.infoFontSize = checkNumAndAddSuffix(args['info-s'], 8, 'pt')data.infoColor = args[8] or args['info-fc'] or 'black'data.infoPadding = args['info-p'] or '0 4px 0 4px'data.infoLineHeight = args['info-lh'] or '1.25em'data.infoOtherParams = args['info-op']-- Get id values.data.showId = truedata.id = args.logo or args[3] or args.id1 or 'id1'data.idWidth = checkNumAndAddSuffix(args['id1-w'], 45, 'px')data.idHeight = checkNumAndAddSuffix(args['id-h'], 45, 'px')data.idBackgroundColor = args[1] or args['id1-c'] or '#dddddd'data.idTextAlign = 'center'data.idFontSize = checkNumAndAddSuffix(args['id1-s'], 14, 'pt')data.idLineHeight = args['id1-lh'] or '1.25em'data.idColor = args['id1-fc'] or data.infoColordata.idPadding = args['id1-p'] or '0 1px 0 0'data.idOtherParams = args['id1-op']-- Get id2 values.data.showId2 = truedata.id2 = args.logo or args[5] or args.id2 or 'id2'data.id2Width = checkNumAndAddSuffix(args['id2-w'], 45, 'px')data.id2Height = data.idHeightdata.id2BackgroundColor = args[7] or args['id2-c'] or args[1] or '#dddddd'data.id2TextAlign = 'center'data.id2FontSize = checkNumAndAddSuffix(args['id2-s'], 14, 'pt')data.id2LineHeight = args['id2-lh'] or '1.25em'data.id2Color = args['id2-fc'] or data.infoColordata.id2Padding = args['id2-p'] or '0 0 0 1px'data.id2OtherParams = args['id2-op']return dataendp['_userbox-r'] = function (args)-- Does argument processing for {{userbox-r}}.local data = {}-- Get div tag values.data.float = args.float or 'left'local borderWidthNum = checkNum(args['border-width'] or args['border-s'], 1) -- Used to calculate width.data.borderWidth = addSuffix(borderWidthNum, 'px')data.borderColor = args['border-color'] or args[1] or args['border-c'] or args['id-c'] or '#999'data.width = addSuffix(240 - 2 * borderWidthNum, 'px') -- Also used in the table tag.data.bodyClass = args.bodyclass-- Get table tag values.data.backgroundColor = args['info-background'] or args[2] or args['info-c'] or '#eee'-- Get id values.data.showId = false -- We only show id2 in userbox-r.-- Get info values.data.info = args.info or args[4] or "<code>{{{info}}}</code>"data.infoTextAlign = args['info-align'] or args['info-a'] or 'left'data.infoFontSize = checkNumAndAddSuffix(args['info-size'] or args['info-s'], 8, 'pt')data.infoPadding = args['info-padding'] or args['info-p'] or '0 4px 0 4px'data.infoLineHeight = args['info-line-height'] or args['info-lh'] or '1.25em'data.infoColor = args['info-color'] or args['info-fc'] or 'black'data.infoOtherParams = args['info-other-param'] or args['info-op']-- Get id2 values.data.showId2 = truedata.id2 = args.logo or args[3] or args.id or 'id'data.id2Width = checkNumAndAddSuffix(args['logo-width'] or args['id-w'], 45, 'px')data.id2Height = checkNumAndAddSuffix(args['logo-height'] or args['id-h'], 45, 'px')data.id2BackgroundColor = args['logo-background'] or args[1] or args['id-c'] or '#ddd'data.id2TextAlign = args['id-a'] or 'center'data.id2FontSize = checkNumAndAddSuffix(args['logo-size'] or args[5] or args['id-s'], 14, 'pt')data.id2Color = args['logo-color'] or args['id-fc'] or data.infoColordata.id2Padding = args['logo-padding'] or args['id-p'] or '0 0 0 1px'data.id2LineHeight = args['logo-line-height'] or args['id-lh'] or '1.25em'data.id2OtherParams = args['logo-other-param'] or args['id-op']return dataendfunction p.render(data)-- Renders the userbox html using the content of the data table. -- Render the div tag html.local root = mw.html.create('div')root:css('float', data.float):css('border', (data.borderWidth or '') .. ' solid ' .. (data.borderColor or '')):css('margin', '1px'):css('width', data.width):addClass('wikipediauserbox'):addClass(data.bodyClass)-- Render the table tag html.local tableroot = root:tag('table')tableroot:attr('role', 'presentation'):css('border-collapse', 'collapse'):css('width', data.width):css('margin-bottom', '0'):css('margin-top', '0'):css('background', data.backgroundColor)-- Render the id html.local tablerow = tableroot:tag('tr')if data.showId thentablerow:tag('td'):css('border', '0'):css('width', data.idWidth):css('height', data.idHeight):css('background', data.idBackgroundColor):css('text-align', data.idTextAlign):css('font-size', data.idFontSize):css('font-weight', 'bold'):css('color', data.idColor):css('padding', data.idPadding):css('line-height', data.idLineHeight):css('vertical-align', 'middle'):cssText(data.idOtherParams):addClass(data.idClass):wikitext(data.id)end-- Render the info html.tablerow:tag('td'):css('border', '0'):css('text-align', data.infoTextAlign):css('font-size', data.infoFontSize):css('padding', data.infoPadding):css('height', data.infoHeight):css('line-height', data.infoLineHeight):css('color', data.infoColor):css('vertical-align', 'middle'):cssText(data.infoOtherParams):addClass(data.infoClass):wikitext(data.info)-- Render the second id html.if data.showId2 thentablerow:tag('td'):css('border', '0'):css('width', data.id2Width):css('height', data.id2Height):css('background', data.id2BackgroundColor):css('text-align', data.id2TextAlign):css('font-size', data.id2FontSize):css('font-weight', 'bold'):css('color', data.id2Color):css('padding', data.id2Padding):css('line-height', data.id2LineHeight):css('vertical-align', 'middle'):cssText(data.id2OtherParams):wikitext(data.id2)endlocal title = mw.title.getCurrentTitle()if (title.namespace == 2) and not title.text:match("/") thenreturn tostring(root) -- regular user pageelseif title.namespace == 14 thenreturn tostring(root) -- categoryelseif title.isTalkPage thenreturn tostring(root) -- talk pageendlocal legible = truelocal contrast = require('Module:Color contrast')._ratiolocal function has_text(wikitext)local function get_alt(text)return text:match("|alt=([^|]*)") or ""endwikitext = wikitext:gsub("]]", "|]]")wikitext = wikitext:gsub("%[%[%s*[Mm][Ee][Dd][Ii][Aa]%s*:[^|]-(|.-)]]", get_alt)wikitext = wikitext:gsub("%[%[%s*[Ii][Mm][Aa][Gg][Ee]%s*:[^|]-(|.-)]]", get_alt)wikitext = wikitext:gsub("%[%[%s*[Ff][Ii][Ll][Ee]%s*:[^|]-(|.-)]]", get_alt)return mw.text.trim(wikitext) ~= ""endif contrast { data.infoColor, data.backgroundColor, error = 0 } < 4.5 thenlegible = falseendif data.showId and contrast { data.idColor, data.idBackgroundColor, error = 0 } < 4.5 thenif has_text(data.id or "") thenlegible = falseendendif data.showId2 and contrast { data.id2Color, data.id2BackgroundColor, error = 0 } < 4.5 thenif has_text(data.id2 or "") thenlegible = falseendendif not legible thenroot:wikitext('[[Category:可能难以辨认的用户框模板]]')endreturn tostring(root)endfunction p.categories(args, page)-- Gets categories from [[Module:Category handler]].-- The page parameter makes the function act as though the module was being called from that page.-- It is included for testing purposes.local cats = {}cats[#cats + 1] = args.usercategorycats[#cats + 1] = args.usercategory2cats[#cats + 1] = args.usercategory3if #cats > 0 then-- Get the title objectlocal titleif page thentitle = mw.title.new(page)elsetitle = mw.title.getCurrentTitle()end-- Build category handler arguments.local chargs = {}chargs.page = pagechargs.nocat = args.nocatchargs.main = '[[Category:未正確放置討論頁模板的頁面]]'if args.notcatsubpages thenchargs.subpage = 'no'end-- User namespace.local user = ''for i, cat in ipairs(cats) douser = user .. makeCat(cat)endchargs.user = user-- Template namespace.local basepage = title.baseTextlocal template = ''for i, cat in ipairs(cats) dotemplate = template .. makeCat(cat, ' ' .. basepage)endchargs.template = templatereturn categoryHandler(chargs)elsereturn nilendendreturn p