Module:StorySim

SSF讨论 | 贡献2023年12月15日 (五) 14:19的版本 (创建页面,内容为“local p = {} local getArgs = require('Module:Arguments').getArgs local function getTextList(txt,add,mod) local t = {}; local isValid = false; for i in string.gmatch(txt .. add,mod) do isValid = isValid or (i ~= '') if isValid then table.insert(t,i);end end return t; end local function delbr(txt) local t = txt; while true do local a = string.sub(t,-4) if a ~= '<br>' then break;end t = string.s…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

可在Module:StorySim/doc创建此模块的帮助文档

local p = {}

local getArgs = require('Module:Arguments').getArgs

local function getTextList(txt,add,mod)
    local t = {};
    local isValid = false;
    for i in string.gmatch(txt .. add,mod) do
        isValid = isValid or (i ~= '')
        if isValid then table.insert(t,i);end
    end
    return t;
end
local function delbr(txt)
    local t = txt;
    while true do
        local a = string.sub(t,-4)
        if a ~= '<br>' then break;end
        t = string.sub(t,1,-5);
    end
    return t;
end

local function getParam(txt,id)
    return string.match(txt,id .. '"(.-)"')
end

local function _summonTextShow(tag,txt)
    local s = '';
    for _,v in ipairs(getTextList(txt,'\n',"(.-)%c")) do
        s = s .. v .. '<br>';
    end
    tag:tag("div"):addClass("textShow"):wikitext(delbr(s));
end

local function summonTextShow(tag,txt)
    for _, v in ipairs(getTextList(txt,"[/]","(.-)%[/%]")) do _summonTextShow(tag,v) end
end

local function summonTalkShow(tag,txt)
    local tableHTML = tag:tag("table"):addClass("talkShow")
    local l = getTextList(txt,'\n',"(.-)%c");
    local node;
    local _type;
    local isEmpty = true;
    for i, v in ipairs(l) do
        -- Init
        local a = ''; -- name="伊洛" class="123"
        local b = ''; -- 知道了知道了。
        for _a, _b in string.gmatch(v, "%[(.-)%](.*)") do 
            a = _a

            isEmpty = (_b == '');
            if isEmpty 
            then b = '<div class="addLine"></div>'
            else b = _b
            end
            -- tableHTML:wikitext(tostring(isEmpty))
        end

        local n = getParam(a,"name");
        if n then
            _type = getParam(a,"type") or 'talk'
            node = tableHTML:tag('tr')
                    :tag('th'):wikitext(n):done()
                    :tag('td')
        else
            _type = getParam(a,"type") or _type
        end

        if _type == 'talk' then node:wikitext(b)
        elseif _type == 'think' then
            if isEmpty then node:wikitext(b):done()
            else node:tag('span'):addClass('thought'):wikitext(b):done()
            end
        else node:tag("span"):addClass("storyError"):wikitext(string.format("警告:无法识别类型名!(line=%d)",i)):done();
        end
        
        if not isEmpty then node:wikitext('<br>') end
    end
end

-- Start --
local function makeInvokeFunc(funcName)
    return function(frame)
        local args = getArgs(frame)
        return p[funcName](args)
    end
end

p.main = makeInvokeFunc('_main')
function p._main(args)-- 生成HTML的主函数 部分代码来源:[[Module:Songtable]]

    --- 构建HTML ---
    local box = mw.html.create("table"):addClass("rotable mw-collapsible mw-collapsed storyTable");
    box:tag('tr'):tag('th'):wikitext(args['title'] or "标题");
    for index, arg in ipairs(args) do
        local tag = box:tag("tr"):tag("td"):addClass("storySim");
            local a = string.match(arg,"textShow>(.+)");
            local b = string.match(arg,"talkShow>(.+)");

            if a then summonTextShow(tag,a);
            elseif b then summonTalkShow(tag,b);
            else tag:tag("span"):addClass("storyError"):wikitext(string.format("警告:无法识别源代码!(arg=%d)",index)):done();
        end
        
        -- box:tag("span"):wikitext(type(index) .. arg):done()
    end
    return tostring(box)
end
return p