模組:Conversion rule extractor
外觀

![]() | 此模組已評為alpha版,可接受第三方輸入,並可用於少量頁面以檢查是否存在問題,但需要受到檢查。歡迎提供新功能或修改其輸入輸出機制的建議。 |
![]() | 此模組使用Lua語言: |
本模組用於提取指定頁面的字詞轉換規則(包括手動規則和公共轉換組規則),並根據需要篩選出能在特定目標頁面或標題上匹配使用的規則,最終以不同格式輸出。
子模組
[編輯]- Module:Conversion_rule_extractor/Extractor – 用於提取規則
- Module:Conversion_rule_extractor/Matcher – 用於匹配規則
函數
[編輯]getRules
[編輯]獲取指定來源頁面的所有內容轉換規則(手動+公共組),並篩選出能在目標頁面內容中匹配到的規則。
調用方式: {{#invoke:Conversion_rule_extractor|getRules|from=来源页面|to=目标页面|flag=输出格式}}
參數:
- from 或匿名參數 1: (必須) 字串,規則來源頁面的標題。
- to: (可選) 字串,用於匹配規則的目標頁面標題。預設為調用模組的當前頁面。
- flag: (可選) 字串,指定輸出規則的旗標。
- H (預設): 輸出為
-{H|规则;}-
格式。 - raw: 直接輸出規則文本,每條規則占一行。
- 其他值 (如 A, D): 輸出為
-{值|规则;}-
格式。
- H (預設): 輸出為
返回值: 字串,格式化後的、能在目標頁面匹配到的內容轉換規則。如果來源頁不存在或無匹配規則,返回空字串。如果缺少 from 參數,返回錯誤提示資訊。
getTitleRule
[編輯]獲取應用於指定來源頁面標題的轉換規則。
- 如果來源頁面有顯式的標題 (T) 規則,則使用該規則。
- 如果沒有顯式標題規則,則嘗試將來源頁面的所有內容規則與其標題文本進行匹配,使用匹配到的規則。
調用方式: {{#invoke:Conversion_rule_extractor|getTitleRule|from=来源页面|flag=输出格式|type=输出类型}}
參數:
- from 或匿名參數 1: (必須) 字串,規則來源頁面的標題。
- flag: (可選) 字串,指定輸出規則的旗標(當type不為context時生效)。
- H (預設): 輸出為
-{H|规则;}-
格式。 - raw: 直接輸出規則文本,每條規則占一行。
- 其他值: 輸出為
-{值|规则;}-
格式。如果規則來源於內容規則匹配,即使指定flag='T',也會強制使用H。
- H (預設): 輸出為
- type: (可選) 字串,指定輸出類型。
- context: (特殊模式) 如果存在顯式T規則,輸出為
-{T规则;}-
。如果不存在顯式T規則,但有內容規則匹配標題,輸出為-{H|匹配的内容规则;}-原始标题
。 - 其他值或省略: 按flag參數指定的格式輸出規則本身。
- context: (特殊模式) 如果存在顯式T規則,輸出為
返回值: 字串,格式化後的標題轉換規則或帶規則的標題文本。如果來源頁不存在或無適用規則,返回空字串。如果缺少from參數或來源頁不存在,返回錯誤提示資訊。
參見
[編輯]- {{NoteTA-lite}}
-- 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