模块:TWRVersionCheck

来自TeamMoeg官方WIKI
Khjxiaogu讨论 | 贡献2022年1月9日 (日) 22:46的版本
跳到导航 跳到搜索

WikiCompareVersion ver1 ver2 1


local p = {}
function p.split (inputstr, sep)
    if sep == nil then
        sep = "%s"
    end
    local t={}
    for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
        table.insert(t, str)
    end
    return t
end
function p.parseNumberVersion(inputstr)
    local rt=p.split(inputstr,"\\.")
    for i, v in ipairs( rt ) do
        rt[i]=tonumber(v);
    end
    return rt
end
function p.isNum(inputstr)
    if inputstr==nil then
        return 0
    end
    local mst=string.sub(inputstr,1,1)
    local lv=string.byte(mst)-48
    if lv>=0 and lv<=9 then
        return 1
    end
    return 0
end
function p.parseSubVersion(inputstr)
    local ext=0
    local ver=""
    local t={}
    for i=1,string.len(inputstr) do
        local mst=string.sub(inputstr,i,i)
        local lv=string.byte(mst)-48
        if lv>=0 and lv<=9 then
            ext=i
            break
        end
        ver=ver..mst
    end
    t.ver=p.parseNumberVersion(string.sub(inputstr,ext))
    t.type=ver
    return t
end
function p.parseFullVersion(inputstr)
    local ss=p.split (inputstr,"-")
    local t={}
    local subs={}
    t.ver=p.parseNumberVersion(ss[1])
    for i=2,#ss do
        subs[i-1]=p.parseSubVersion(ss[i])
    end
    t.sub=subs
    return t
end
function p.compareNumberVersion(t1,t2)
    local len=math.min(#t1,#t2)
    for i=1,len do
        if t1[i]>t2[i] then
            return 1
        elseif t1[i]<t2[i] then
            return -1
        end
    end
    return 0 
end
p.types={}
p.types.pre=-1
p.types.rc=0
p.types.stable=1
p.types.hf=2
function p.compareSubVersion(t1,t2)
    local p1=p.types[t1.type]
    local p2=p.types[t2.type]
    if p1>p2 then
        return 1
    elseif p1<p2 then
        return -1
    end
    return p.compareNumberVersion(t1.ver,t2.ver)
end
function p.compareFullVersion(t1,t2)
    local mv=p.compareNumberVersion(t1.ver,t2.ver)
    if mv~=0 then
        return mv
    end
    if #t1.sub==0 then
        if #t2.sub~=0 then
            if t2.sub[1].type~="pre" then
                return -1
            end
            return 1
        end
        return 0
    end
    if #t2.sub==0 then
        if t1.sub[1].type=="pre" then
            return -1
        end
        return 1
    end
    local len=math.min(#t1.sub,#t2.sub)
    for i=1,len do
        local mv2=p.compareSubVersion(t1.sub[i],t2.sub[i])
        if mv2~=0 then
            return mv2
        end
    end
    if #t2.sub>#t1.sub then
        if t2.sub[#t1.sub+1].type=="pre" then
            return 1
        end
        return -1
    elseif #t2.sub<#t1.sub then
        if t1.sub[#t2.sub+1].type=="pre" then
            return -1
        end
        return 1
    end
    return 0
end
function p.compareVersion(s1,s2)
    if s1==nil then
        return -1
    elseif s2==nil then
        return 1
    end
    return p.compareFullVersion(p.parseFullVersion(s1),p.parseFullVersion(s2))
end
function p.WikiCompareVersion(frame)
    if p.compareVersion(frame.args.ver1,frame.args.ver2)>=0 then
        return 1
    end
end
return p;