-- 本模块由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