模块:SpecialWikitext

来自维阿百科
跳转至: 导航搜索

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

--- @diagnostic disable: lowercase-global
--- https://zh.wikipedia.org/wiki/_?oldid=65986479
local p = {
    wikiTextKey = '_addText'
}

function p.displayWikitext()
    local body = ''
    local title = mw.title.getCurrentTitle()
    local this_frame = mw.getCurrentFrame()

    local pagename = title.nsText .. ':' .. title.rootText
    local pagesubname = mw.ustring.gsub(title.fullText, "[^:/]*:[^/]+", '')

    local notice = this_frame:preprocess('{{#invoke:SpecialWikitext/Template|getNotices|' .. pagename .. '|' .. pagesubname .. '}}') or ''
    body = body .. '<div class="mw-editnotice-content">' .. notice .. '</div>'

    local wikitext = p.check() or ''
    body = body .. '<div class="mw-_addText-content">' .. wikitext .. '</div>'

    return body
end

function p.check()
    local content_model = mw.ustring.lower(mw.title.getCurrentTitle().contentModel)
    if content_model == 'json' then
        return _getJSONwikitext()
    elseif content_model == 'js' or content_model == 'javascript' or content_model == 'text' then
        return _getJSwikitext()
    elseif content_model == 'css' or content_model == 'sanitized-css' then
        return _getCSSwikitext()
    end
    return ''
end

local TemplateParameters = {}
function _addText(input_str, new_str, escape)
    if not TemplateParameters._get_escape then TemplateParameters = require('Module:TemplateParameters') end
    if new_str ~= '' then
        if input_str ~= '' then input_str = input_str .. '\n' end
        local text = new_str
        if escape then text = TemplateParameters._get_escape(new_str) end
        input_str = input_str .. text
    end
    return input_str
end

function _getString(str)
    local test_str = mw.ustring.match(str, "[^\n]*%*/")
    if test_str then test_str = mw.ustring.sub(test_str, 1, -3)
    else test_str = str end
    local trim_check = mw.text.trim(test_str)
    local first_char = mw.ustring.sub(trim_check, 1, 1)
    if first_char == mw.ustring.sub(trim_check, -1, -1) and (first_char == "'" or first_char == '"') then
        return mw.ustring.sub(trim_check, 2, -2)
    else
        return test_str
    end
end

function _getContentText(str)
    local wikitext = ''
    xpcall(function()
        local it = mw.ustring.gmatch(str, p.wikiTextKey .. "%s*%{[^c%}]*content%s*:%s*[^\n]*")
        local text = it()
        while text do
            local temp_text = mw.ustring.gsub(mw.text.trim(
                mw.ustring.match(text, "content%s*:%s*[^\n]*"), "\t\r\n\f ;}"
            ), "%s*content%s*:%s*", "")
            if wikitext ~= '' then wikitext = wikitext .. '\n' end
            wikitext = wikitext .. _getString(temp_text)
            text = it()
        end
    end, function() end)
    return wikitext
end

function _getObjText(str)
    local wikitext = ''
    xpcall(function()
        local it = mw.ustring.gmatch(str, p.wikiTextKey .. "%s*[%=:]%s*[^\n]*")
        local text = it()
        while text do
            local temp_text = mw.ustring.gsub(
                mw.text.trim(text, "\t\r\n\f ;}"),
                p.wikiTextKey .. "%s*[%=:]%s*", "")
            if wikitext ~= '' then wikitext = wikitext .. '\n' end
            wikitext = wikitext .. _getString(temp_text)
            text = it()
        end
    end, function() end)
    return wikitext
end

function _getCSSwikitext(input_string)
    local this_frame = mw.getCurrentFrame()
    local wikitext = ''
    local css_text = input_string or mw.title.getCurrentTitle():getContent()
    wikitext = _addText(wikitext, _getContentText(css_text), true)
    wikitext = _addText(wikitext, _getObjText(css_text), true)
    if wikitext ~= '' then wikitext = this_frame:preprocess(wikitext) end
    return wikitext
end

function _getJSwikitext(input_string)
    local this_frame = mw.getCurrentFrame()
    local wikitext = ''
    local js_text = input_string or mw.title.getCurrentTitle():getContent()
    wikitext = _addText(wikitext, _getObjText(js_text), true)
    if wikitext ~= '' then wikitext = this_frame:preprocess(wikitext) end
    return wikitext
end

function _getJSONwikitext(input_string)
    local this_frame = mw.getCurrentFrame()
    local wikitext = ''
    xpcall(function()
        local json_data = mw.text.jsonDecode(input_string or mw.title.getCurrentTitle():getContent())
        for k, v in pairs(json_data) do
            if mw.ustring.match(k, p.wikiTextKey) and type(v) == type('') then
                wikitext = _addText(wikitext, v)
            end
            if type(v) == type({}) then
                for testArr_k, testArr_v in pairs(v) do
                    if mw.ustring.match(testArr_k, p.wikiTextKey) and type(testArr_v) == type('') then
                        wikitext = _addText(wikitext, testArr_v)
                    end
                end
            end
        end
    end, function() end)
    if wikitext ~= '' then wikitext = this_frame:preprocess(wikitext) end
    return wikitext
end

local lib_arg = {}
function _getTestFromFrame(frame)
    local str = ''
    if frame == mw.getCurrentFrame() then
        if lib_arg.getArgs == nil then lib_arg = require('Module:Arguments') end
        local args = lib_arg.getArgs(frame) --frame
        str = args[1] or args['1'] or args.str
    else
        if type(frame) == type({}) then str = frame[1] or frame['1'] or frame.str
        else str = tostring(frame) end
    end
    if mw.text.trim(str or '') == '' then str = mw.title.getCurrentTitle():getContent() end
    return str
end

function p.getCSSwikitext(frame) return _getCSSwikitext(_getTestFromFrame(frame)) end

function p.getJSwikitext(frame) return _getJSwikitext(_getTestFromFrame(frame)) end

function p.getJSONwikitext(frame) return _getJSONwikitext(_getTestFromFrame(frame)) end

return p