Module:Oldpuabox

此后如竟没有炬火,我便是唯一的光。

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

local p = {}
local getArgs = require('Module:Arguments').getArgs

function p.str2codelist(strin)  --转换字符串到unicode码位构成的数组,仅支持第一平面字符
    local listout={}
    local strk=1
    local listk=1
    while strk <= #strin do
        if(math.modf(string.byte(strin,strk)/16)==14)then
            listout[listk]=(string.byte(strin,strk)-224)*4096+(string.byte(strin,strk+1)-128)*64+(string.byte(strin,strk+2)-128)
			listk=listk+1
            strk=strk+3
        elseif(math.modf(string.byte(strin,strk)/32)==6)then
            listout[listk]=(string.byte(strin,strk)-192)*64+(string.byte(strin,strk+1)-128)
			listk=listk+1
            strk=strk+2
        else
            listout[listk]=string.byte(strin,strk)
			listk=listk+1
            strk=strk+1
        end
    end
    return listout
end

function p.code2str(codein)  --转换unicode码位到对应字符,仅支持第一平面字符
    if(codein>=2048)then
       return string.char(224+math.modf(codein/4096),128+math.modf((codein%4096)/64),128+codein%64)
    elseif(codein>=128)then
       return string.char(192+math.modf(codein/64),128+codein%64)
    else
       return string.char(codein)
    end
end

function p.addsprite(frame)  --转换字符中旧pua的部分为sprite图
    local args = getArgs(frame)
    local list = p.str2codelist(args[1])
    local out = ""
    for k,v in ipairs(list)do
        if(v>=57344 and v<=60159)then --在sprite支持的范围
            out=out.."{{Oldpuasim|"..p.code2str(v).."}}"
        else
            out=out..p.code2str(v)
        end
    end
    return frame:preprocess(out)  --预处理包含的oldpua模板
end

return p