模块:Nowiki

求闻百科,共笔求闻

本模块用于模板链接:{{nowiki}}模板。

上述文档内容嵌入自Module:Nowiki/doc编辑 | 历史
编者可以在本模块的沙盒创建 | 镜像和测试样例创建页面进行实验。
请将模块自身所属的分类添加在文档中。本模块的子页面
-- 本模块由SolidBlock创建,用于将一段文字转化为防止被解析的转义文字。

local p = {}
local nowiki = mw.text.nowiki
local function yesno(arg, default)
	if arg=='1' then
		return true
	elseif arg=='0' then
		return false
	elseif arg==nil then
		return default
	else
		return arg
	end
end

p.conversionList = {
	-- 文本转换表。
	['('] = '{',
	[')'] = '}',
	['!'] = '|',
}

p.escapeList = {
	e = '=',
	p = '|',
	n = '\n',
	t = '\t',
	v = '',
	s = ' ',
	['\\'] = '\\\\',
}

function p.convert(str)
	-- 用于将字符串str中的通常不被解析的文字转化为容易被解析的文字,
	-- 但是先不会进行nowiki转义。
	local conversionList = p.conversionList
	local num
	str,num = str:gsub('.',conversionList)
	return str
end

function p.deEscape(str)
	str = str:gsub('\\([a-z])', p.escapeList)
	str = str:gsub('<([a-z])>', p.escapeList)
	str = str:gsub('<tag:(.-)>','<%1>')
	str = str:gsub('\\(.)','%1')
	return str
end

function p._nowiki(args)
	local text = args.text -- 说明:args[1]也写在了text中,参见p.nowiki。
	if not text then
		error "模块没有收到文本,请检查调用模板时是否含有被解析的等号。"
		return
	end
	local trim = yesno(args.trim, true)
	local bare = yesno(args.bare, false) -- 如果true,则不会添加code标签。
	local convert = yesno(args.convert, true)
	local deEscape = yesno(args.deescape, true)
	local nowiki = yesno(args.nowiki, true)
	if trim then
		text = mw.text.trim(text)
	end
	if convert then
		text = p.convert(text)
	end
	if deEscape then
		text = p.deEscape(text)
	end
	if nowiki then
		text = mw.text.nowiki(text)
	end
	if bare then
		return text
	else
		return '<code>' .. text .. '</code>'
	end
end

function p.nowiki(frame)
	local args = {}
	for k,v in pairs(frame:getParent().args) do
		if k=='text' or k==1 then
			args.text = v
		else
			args[k] = mw.text.trim(v)
		end
	end
	return p._nowiki(args)
end

return p