跳转到内容

模组:Conversion rule extractor

本页使用了标题或全文手工转换
维基百科,自由的百科全书

-- Module:Conversion_rule_extractor
-- 主模块:处理调用参数,协调子模块,格式化输出

local p = {}

local Extractor = require('Module:Conversion_rule_extractor/Extractor')
local Matcher = require('Module:Conversion_rule_extractor/Matcher')
local WikitextLC = require('Module:WikitextLC')
local Arguments = require('Module:Arguments')

-- 格式化输出规则列表 (确保使用规范化的规则)
local function formatRules(rules, flag)
    flag = flag or 'H' -- 默认 H
    local output = {}

    -- 输入的 rules 应该已经是 Extractor.normalizeRuleString 处理过的

    if flag == 'raw' then
        -- 直接连接,每条规则已包含分号
        return table.concat(rules, "\n")

    elseif flag == 'H' then
        for _, rule in ipairs(rules) do table.insert(output, WikitextLC.hidden(rule)) end -- 输出 -{H|rule;}-

    elseif flag == 'T' then
        -- 理论上只应在显式 T 规则存在且请求 flag=T 时使用
        -- 注意:WikitextLC.title 输出 -{T|rule;}-
        for _, rule in ipairs(rules) do table.insert(output, WikitextLC.title(rule)) end

    else -- 其他 flag,例如 A, D 等,直接用作旗标
        local pattern = '-{' .. flag .. '|%s}-'
        for _, rule in ipairs(rules) do
            if rule and rule ~= '' then
                table.insert(output, string.format(pattern, rule))
            end
        end
    end
    return table.concat(output)
end

-- 用于 type=context 且有 T 规则时的基本转换格式 -{rule;}-
local function formatRawContextRule(rule)
    if rule and rule ~= '' then
        return '-{' .. rule .. '}-'
    else
        return ''
    end
end

-- 获取并过滤内容规则
function p.getRules(frame)
    local args = Arguments.getArgs(frame)
    local fromPage = args.from or args[1]
    local toPage = args.to or mw.title.getCurrentTitle().prefixedText -- 默认为当前页面
    local flag = args.flag or 'H'

    if not fromPage then
        return '<span class="error">错误:未指定规则来源页面(需要 "from" 或匿名参数 1)。</span>'
    end

    local fromTitleObj = mw.title.new(fromPage)
    if not fromTitleObj or not fromTitleObj.exists then
        -- 来源页不存在时,Extractor 返回空规则,最终输出空字符串
    end

    local allRules = Extractor.getAllRules(fromPage)
    if not allRules then return '' end

    local applicableContentRules = Matcher.filterRules(allRules.contentRules, toPage)

    return formatRules(applicableContentRules, flag)
end

-- 获取标题转换规则 (type=context 无 T 规则时恢复为 H 旗标 + 原始文本)
function p.getTitleRule(frame)
    local args = Arguments.getArgs(frame)
    local fromPage = args.from or args[1]
    local flag = args.flag or 'H'
    local typeParam = args.type

    if not fromPage then
        return '<span class="error">错误:未指定规则来源页面(需要 "from" 或匿名参数 1)。</span>'
    end

    local titleObj = mw.title.new(fromPage)
    if not titleObj or not titleObj.exists then
         return '<span class="error">错误:来源页面 "' .. fromPage .. '" 不存在。</span>'
    end

    local allRules = Extractor.getAllRules(fromPage)
    if not allRules then return '' end

    local finalTitleRules = {}

    if allRules.titleRule and allRules.titleRule ~= '' then
        finalTitleRules = { allRules.titleRule }
    else
        finalTitleRules = Matcher.filterRulesAgainstTitleText(allRules.contentRules, fromPage)
    end

    if #finalTitleRules == 0 then
        return ""
    end

    if typeParam == 'context' then
        local output
        if allRules.titleRule and allRules.titleRule ~= '' then
            -- Case 1: 显式 T 规则,使用 -{rule;}- 格式
            output = formatRawContextRule(allRules.titleRule)
        else
            -- Case 2: 内容规则匹配标题,输出 -{H|...}- 规则 + 原始标题文本
            local hiddenRules = formatRules(finalTitleRules, 'H') -- 使用 H 旗标格式化规则
            output = hiddenRules .. titleObj.text -- 附加原始标题文本
        end
        return output
    else
        -- 常规处理:根据 flag 输出规则本身
        local outputFlag = flag
        if not allRules.titleRule and outputFlag == 'T' then
            outputFlag = 'H' -- 如果规则来自内容,不允许 T 旗标,强制 H
        end
        return formatRules(finalTitleRules, outputFlag)
    end
end

return p