• Moegirl.ICU:萌娘百科流亡社群 581077156(QQ),欢迎对萌娘百科运营感到失望的编辑者加入
  • Moegirl.ICU:账号认领正在试运行,有意者请参照账号认领流程

Module:Mjs

萌娘百科,万物皆可萌的百科全书!转载请标注来源页面的网页链接,并声明引自萌娘百科。内容不可商用。
跳转到导航 跳转到搜索
Template-info.svg 模块文档  [创建] [刷新]
alias = {
    ["0m"] = "5m*", ["0p"] = "5p*", ["0s"] = "5s*", ["0z"] = "5z*",
    Em = "3m*", Ep = "3p*", Es = "3s*", 
    Zs = "2s", Rs = "3s",
    ton = "1z", azuma = "1z", dong = "1z",
    nan = "2z", minami = "2z",
    sha = "3z", shaa = "3z", nishi = "3z", xi = "3z",
    pe = "4z", pee = "4z", pei = "4z", hoku = "4z", bei = "4z",
    haku = "5z", shiro = "5z", bai = "5z", baiban = "5z", ["8z"] = "5z",
    hatsu = "6z", fa = "6z", ao = "6z", Bz = "6z",
    chung = "7z", zhong = "7z", hongzhong = "7z",
    ["9z"] = "#",
    haru = "1k", chun = "1k",
    natsu = "2k", xia = "2k",
    aki = "3k", qiu = "3k",
    fuyu = "4k", Dong = "4k",
    ume = "5k", mei = "5k",
    ran = "6k", lan = "6k",
    take = "7k", zhu = "7k",
    kiku = "8k", ju = "8k",
    ["9k"] = "#"
}

return {
    main = function(frame)
        local s = frame.args[1]
        local l = s:len()
        local rot = false -- rotate
        local rpl = false -- rotate plus
        local red = false
        local cyan = false
        if l == 1 then
            return "🀫"
        end
        local flag = true
        while flag do -- handle tags
        	flag = false
            if s:sub(l, l) == "r" then
                s = s:sub(1, l - 1)
                rot = true
                flag = true
                l = l - 1
            end
            if s:sub(l, l) == "j" then
                s = s:sub(1, l - 1)
                rpl = true
                flag = true
                l = l - 1
            end
            if (l >= 6 and 
                (s:sub(l - 3, l) == "_aka" 
                or s:sub(l - 3, l) == "_red"))
                then
                s = s:sub(1, l - 4)
                red = true
                flag = true
                l = l - 4
            end
            if (l >= 6 and 
                (s:sub(l - 2, l) == "_ao" 
                or s:sub(l - 4, l) == "_cyan"))
                then
                s = s:sub(1, l - 4)
                cyan = true
                flag = true
                l = l - 4
            end
            if (l >= 5 and s:sub(l - 2, l) == "_gb") then -- do nothing here
                s = s:sub(1, l - 3)
                flag = true
                l = l - 3
            end
        end -- handle tags end
        if alias[s] then
            s = alias[s]
        end
        l = s:len()
        if l == 1 then
            return '<span class = "hai">&#127019;</span>'
        end
        if l == 3 and s:sub(l, l) == "*" then
            red = true
            s = s:sub(1, 2)
            l = 2
        end
        if l == 3 and s:sub(l, l) == "^" then
            cyan = true
            s = s:sub(1, 2)
            l = 2
        end
        local red_id = -1
        if rpl and l == 3 then
            if s:sub(1, 1) == "0" then
                s = "5" .. s:sub(3, 3)
                red_id = 1
            elseif s:sub(2, 2) == "0" then
                s = "5" .. s:sub(3, 3)
                red_id = 2
            elseif s:sub(1, 1) == "E" then
                s = "3" .. s:sub(3, 3)
                red_id = 1
            elseif s:sub(2, 2) == "E" then
                s = "3" .. s:sub(3, 3)
                red_id = 2
            end
            l = 2
        end
        if l ~= 2 then
            return '<strong class = "error">错误格式</strong>'
        end
        local suit = s:sub(l, l)
        local id = s:sub(1, l-1)
        local ret
        local real_id = tonumber(id)
        if not real_id then
            return '<strong class = "error">错误格式</strong>'
        end
        if suit == "m" then
            ret = ("&#%d;"):format(126982+real_id)
        elseif suit == "p" then
            ret = ("&#%d;"):format(127000+real_id)
        elseif suit == "s" then
            ret = ("&#%d;"):format(126991+real_id)
        elseif suit == "z" then
            if real_id > 4 then
                real_id = 12 - real_id -- 7 -> 5; 5 -> 7; 6 -> 6
            end
            ret = ("&#%d;"):format(126975+real_id)
        elseif suit == "k" then
            if real_id > 4 then
                real_id = real_id - 4
            else
                real_id = real_id + 4
            end
            ret = ("&#%d;"):format(127009+real_id)
        else
            return '<strong class = "error">错误格式</strong>'
        end
        if red then
            ret = '<span class = "aka" style="color:red" title = "赤宝牌">'..ret..'</span>'
        elseif cyan then
            ret = '<span class = "ao" style="color:cyan" title = "青宝牌">'..ret..'</span>'
        else
            ret = '<span class = "normal">'..ret..'</span>'
        end
        if rot then
            local obj = mw.html.create("span")
            obj:addClass("naki"):tag("span"):addClass("rotate"):wikitext(ret)
            ret = tostring(obj)
        elseif rpl then
            local obj = mw.html.create("span")
            obj:addClass("kakan")
            local ret1 = ret
            local ret2 = ret
            if red_id == 1 then
                ret1 = '<span class = "aka" style="color:red" title = "赤宝牌">'..ret..'</span>'
            elseif red_id == 2 then
                ret2 = '<span class = "aka" style="color:red" title = "赤宝牌">'..ret..'</span>'
            end
            obj:tag("span"):addClass("naki"):tag("span"):addClass("rotate"):wikitext(ret1)
            obj:tag("span"):addClass("naki"):tag("span"):addClass("rotate"):wikitext(ret2)
            ret = tostring(obj)
        end
        return ret
    end
}