打开/关闭菜单
5
6
152
卡车模拟中文维基
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

此模块的文档可以在Module:BadgeLua/doc创建

require('strict')

--- Lua interface for building a badge.

local Icon = require('Module:Icon')

--- @class BadgeProps
--- @field text string
--- @field variant 'error'|'success'|'warning'
--- @field color string
--- @field backgroundColor string
--- @field icon string
--- @field mask boolean             Render the icon as a currentColor mask (matches the badge colour)
--- @field link string             Wrap the whole badge in a link to this page
--- @field class string

local VARIANTS = {
	error = true,
	success = true,
	warning = true,
}

local p = {}

--- @param props BadgeProps
--- @return string
function p.render(props)
	local root = mw.html.create('span'):addClass('t-badge')

	if type(props.variant) == 'string' and VARIANTS[props.variant] then
		root:addClass('t-badge--' .. props.variant)
	end

	if type(props.class) == 'string' then
		root:addClass(props.class)
	end

	if type(props.color) == 'string' then
		root:css('color', props.color)
	end

	if type(props.backgroundColor) == 'string' then
		root:css('background-color', props.backgroundColor)
	end

	if type(props.icon) == 'string' then
		root:wikitext(Icon.render({
			icon = props.icon,
			size = '16px',
			mask = props.mask,
			class = 't-badge__icon',
		}))
	end

	root:tag('span'):addClass('t-badge__text'):wikitext(props.text)

	local frame = mw.getCurrentFrame()
	local styles = frame:extensionTag({
		name = 'templatestyles',
		args = { src = 'Module:BadgeLua/styles.css' },
	})
	-- Icon ships its own stylesheet; only needed when the badge has an icon.
	if type(props.icon) == 'string' then
		styles = styles
			.. frame:extensionTag({
				name = 'templatestyles',
				args = { src = 'Module:Icon/styles.css' },
			})
	end

	local badge = tostring(root)
	-- Wrap the whole pill in one anchor so the entire badge is the link, not just
	-- its text. The templatestyles tags stay outside the link label.
	if type(props.link) == 'string' and props.link ~= '' then
		badge = string.format('[[%s|%s]]', props.link, badge)
	end

	return styles .. badge
end

--- Wikitext entry point for the module
---
--- Accepts shorthand argument names for the most common props:
--- - first positional argument is the badge text
--- - `bg` is an alias for `backgroundColor`
---
--- @param frame mw.frame
--- @return string
function p.main(frame)
	local getArgs = require('Module:Arguments').getArgs
	local args = getArgs(frame)

	if args.text == nil then
		args.text = args[1]
	end

	if args.backgroundColor == nil then
		args.backgroundColor = args.bg
	end

	if args.mask ~= nil then
		args.mask = require('Module:Yesno')(args.mask)
	end

	return p.render(args)
end

return p