• 欢迎来到THBWiki!如果您是第一次来到这里,请点击右上角注册一个帐户
  • 有任何意见、建议、求助、反馈都可以在 讨论板 提出
  • THBWiki以专业性和准确性为目标,如果你发现了任何确定的错误或疏漏,可在登录后直接进行改正

模块:tttools

Da THBWiki.
Jump to navigation Jump to search
Lua-Logo.svg 模块文档[创建]
-- 本模块包含翻译表系统相关的工具函数

local tttools = {}

-- #ttt 函数的第二个参数 (段落名) 取 = 表示第一个标题之前的部分
-- 如果要用模板来还原, 这个等号会被解析为一个名称为空字符串的参数, 其值也是空字符串
-- 以下函数可以将出现这种情况的参数还原为标准形式
-- 例如 { '页面名', '5-14', 'zh', '其他匿名参数', [''] = '', ['其他命名参数'] = 'xxx' }
--  ==> { '页面名', '=', '5-14', 'zh', '其他匿名参数', ['其他命名参数'] = 'xxx' }
function tttools.normalize_args(args)
    local new = {}
    for k, v in pairs(args) do
        new[k] = v
    end
    if new[''] == '' then
        new[''] = nil
        for i = #new, 2, -1 do
            new[i + 1] = new[i]
        end
        new[2] = '='
    end
    return new
end

-- 获取翻译表内容, 可以传入最多 4 个参数的列表, 与 #tttt 函数的后 4 个参数用法相同
-- 返回值为形如 { ['#'] = '行号', ['?'] = '类型', ['代号1'] = '内容1', ... } 的表组成的列表
-- 内容中的模板会被解析, 内容最后的一个换行会被保留
function tttools.get_content(args)
    local frame = mw.getCurrentFrame()

    -- #tttt 的模板留空, 就无法解析, 会以 {{|?=...|#=...|...}} 的形式输出, 可以从中提取内容
    local text = frame:callParserFunction('#tttt:', args)

    local parsed = {}
    for block in text:gmatch('{{(.-)}}') do  -- 文本中的模板已被解析, 这里不会出现嵌套模板
        -- 将 [[...|...]] 中的 | 临时换为控制字符
        block = block:gsub('%[%[.-%]%]', function(link)
            return link:gsub('|', '\1')
        end)

        local row = {}
        for k, v in block:gmatch('|([^=]+)=([^|]*)') do
            row[k] = v:gsub('\1', '|')
        end
        table.insert(parsed, row)
    end
    return parsed
end

return tttools