模組:Sandbox/SinonJZH/SwitchTranslate

萌娘百科,萬物皆可萌的百科全書!轉載請標註來源頁面的網頁連結,並聲明引自萌娘百科。內容不可商用。
前往: 導覽搜尋
Template-info.svg 模塊文檔  [] [刷新]
local p = {}
local _frame = nil

local _VAR_PREFIX = "switch_translate"
local _TOGGLE_PREFIX = "mw-customtoggle-switch_translate_"
local _COLL_PREFIX = "mw-customcollapsible-switch_translate_"

local function write_index_var(index)
    mw.logObject(index)
    for i,v in ipairs(index) do
        mw.log("#vardefine", _VAR_PREFIX .. "index" .. i, v)
        _frame:callParserFunction("#vardefine", _VAR_PREFIX .. "index" .. i, v)  -- index變量用於存放每個index對應的譯名名稱
    end
    mw.log("#vardefine", _VAR_PREFIX .. "len", table.maxn(index))
    _frame:callParserFunction("#vardefine", _VAR_PREFIX .. "len", table.maxn(index)) -- len變量用於存放index的數量
end

local function get_index_data(data)
    local index = {}
    for k,v in pairs(data[1]) do
        if k ~= "default" then
            table.insert(index, k)
        end
    end
    write_index_var(index)
    return index
end

local function write_data_var(index,data)
    for i, v in ipairs(data) do
        local all_name = "|" .. v["default"]
        mw.log("#vardefine", _VAR_PREFIX .. "data" .. v["default"], i)
        _frame:callParserFunction("#vardefine", _VAR_PREFIX .. "data" .. v["default"], i)
        for ii, vv in ipairs(index) do
            local name = v[vv] or v["default"]
            all_name = all_name .. "|" .. name
            mw.log("#vardefine", _VAR_PREFIX .. "data" .. name, i)
            _frame:callParserFunction("#vardefine", _VAR_PREFIX .. "data" .. name, i) -- data變量的["name"]鍵值用於存放對應的index索引
        end
        mw.log("#vardefine", _VAR_PREFIX .. "data" .. i, all_name)
        _frame:callParserFunction("#vardefine", _VAR_PREFIX .. "data" .. i, all_name) -- -- data變量的[index]鍵值用於存放index對應的譯名列表,格式為:"|default|譯名1|譯名2|..."
    end
end

local function generate_switch(index)
    local output = "<span class=\"switch-translate-switch\">"
    output = output .. mw.ustring.format("<span class=\"mw-collapsible mw-collapsed switch-translate-btn-0\" id=\"%s\"><span class=\"%s\">%s</span></span>", _COLL_PREFIX .. 0, _TOGGLE_PREFIX .. 0, "共識譯名")
    for i,v in ipairs(index) do
        output = output .. mw.ustring.format("<span class=\"mw-collapsible switch-translate-btn-%s\" id=\"%s\"><span class=\"%s\">%s</span></span>", i, _COLL_PREFIX .. i, _TOGGLE_PREFIX .. i, v)
    end
    output = output .. "</span>"
    return output
end

function p.switch(page_name)
    local data = mw.text.jsonDecode(mw.title.new(page_name):getContent())
    mw.log("獲取的data數據:")
    mw.logObject(data)
    local index = get_index_data(data)
    write_data_var(index,data)
    return generate_switch(index)
end

function p.show(name)
    local index = _frame:callParserFunction("#var", _VAR_PREFIX .. "data" .. name)
    local all_name = _frame:callParserFunction("#var", _VAR_PREFIX .. "data" .. index)
    local output = "<span class=\"switch-translate-name\">"
    local i = 0
    for name in mw.ustring.gmatch(all_name, "|([^|]+)") do
        if i == 0 then
            output = output .. mw.ustring.format("<span class=\"mw-collapsible\" id=\"%s\">%s</span>", _COLL_PREFIX .. i, name)
        else
            output = output .. mw.ustring.format("<span class=\"mw-collapsible mw-collapsed\" id=\"%s\">%s</span>", _COLL_PREFIX .. i, name)
        end
        i = i + 1
    end
    output = output .. "</span>"
    return output
end

function p.main(frame)
    _frame = frame
    local mode = frame.args[1]
    local arg = frame.args[2]
    if not mode or not arg then
        return "<span class=\"scribunto-error\">模塊缺失必需參數!請前往模板文檔確認用法!</span>"
    end
    if mode == "switch" then
        mw.incrementExpensiveFunctionCount()
        return p.switch(arg)
    elseif mode == "show" then
        return p.show(arg)
    end
    return "<span class=\"scribunto-error\">模塊參數錯誤!請前往模板文檔確認用法!</span>"
end

return p