|
|
| 第1行: |
第1行: |
| local p = {} | | local p = {} |
| local valueTypes = mw.loadData('Module:db/types')
| |
| local groupsConfig = mw.loadData('Module:db/groups')
| |
|
| |
|
| local i18n = { | | function p.value(frame) |
| ['true'] = '是',
| | local args = frame.args |
| ['false'] = '否',
| | |
| ['none'] = '\'\'无\'\'',
| | -- 遍历所有参数,查找模块名和键名 |
| ['error_raw_only'] = '<span class="error">Autovalue:数据类型"%s"只能通过tryGetRawValue方法获取值。</span>',
| | for paramName, paramValue in pairs(args) do |
| ['category_unknown_value_type'] = '未知自动值类型',
| | -- 检查参数格式是否为"模块名=键名" |
| ['category_missing_value'] = '缺失%s',
| | if string.find(paramName, "=") then |
| ['content_or'] = '或',
| | local moduleName, key = string.match(paramName, "(.+)=(.+)") |
| ['grouping_others'] = '其他',
| | |
| }
| | if moduleName and key then |
| | | -- 动态加载指定模块 |
| local function tableHasValue (targetTable, targetValue) | | local success, moduleData = pcall(require, 'Module:' .. moduleName) |
| for index, value in ipairs(targetTable) do
| | |
| if value == targetValue then
| | if success and moduleData then |
| return true | | -- 返回对应键的值 |
| | return tostring(moduleData[key] or '键不存在') |
| | else |
| | return '模块不存在或加载失败' |
| | end |
| | end |
| end | | end |
| end | | end |
| return false | | |
| end
| | return '请使用格式: 模块名=键名' |
| | |
| local function IsSameArray(arr1, arr2)
| |
| if #arr1 ~= #arr2 then
| |
| return false
| |
| end
| |
| for i, entry in ipairs(arr1) do
| |
| if not tableHasValue (arr2, entry) then
| |
| return false
| |
| end
| |
| end
| |
| return true
| |
| end
| |
| | |
| local function ValueTypeExist(valueType)
| |
| return valueTypes[valueType] ~= nil
| |
| end
| |
| | |
| local function MappingKey(key, mappingName)
| |
| return p.getRawValue(key, mappingName) or key
| |
| end
| |
| | |
| local function GetValuesTable(valueType, onlyBE)
| |
| local values
| |
| if valueTypes[valueType].beTable then
| |
| values = mw.loadData('Module:' .. valueType .. ' values')
| |
| end
| |
| return values
| |
| end
| |
| | |
| local function MappingValueFull(mappingFullName, value)
| |
| local mapping = mw.loadData(mappingFullName)
| |
| if mapping[value] then
| |
| return mapping[value]
| |
| else
| |
| return value
| |
| end
| |
| end
| |
| | |
| local function MappingValue(mappingName, value)
| |
| return MappingValueFull('Module:db/' .. mappingName .. ' mapping', value)
| |
| end
| |
| | |
| local function ValueFromValuesByKey(values, key)
| |
| local value = values[key]
| |
| --if value == nil then
| |
| -- value = values[key:gsub('s$', '')]
| |
| --end
| |
| if value == nil then
| |
| value = values['__fallback']
| |
| end
| |
| return value
| |
| end
| |
| | |
| -- 键映射方法。
| |
| local keyMappingMethod = {
| |
| }
| |
| | |
| local valueGettingMethod = {
| |
| }
| |
| | |
| -- 将true和false分别转换为'是'和'否'。
| |
| local function TrueFalueMapping (value)
| |
| if value == true then
| |
| return i18n['true'];
| |
| elseif value == false then
| |
| return i18n['false'];
| |
| else
| |
| return value
| |
| end
| |
| end
| |
| | |
| -- 为数字添加逗号分隔符。
| |
| local function FormatNumber (value)
| |
| if type(value) == 'number' then
| |
| local i, j, minus, int, fraction = tostring(value):find('([-]?)(%d+)([.]?%d*)')
| |
| int = int:reverse():gsub("(%d%d%d)", "%1,")
| |
| return minus .. int:reverse():gsub("^,", "") .. fraction
| |
| else
| |
| return value
| |
| end
| |
| end
| |
| | |
| local function FormatRomanNumber(value)
| |
| local roman = require( [[Module:Roman number]] ).toroman(value)
| |
| if roman then return roman end
| |
| return FormatNumber (value)
| |
| end
| |
| | |
| local function EmptyStringToNone(value)
| |
| if value == '' then return i18n['none'] end
| |
| return value
| |
| end
| |
| | |
| -- 值映射方法,不设置则输出原值。
| |
| --数值类
| |
| local valueMappingMethod = {
| |
| ['4b_nm_difficulty'] = FormatNumber,
| |
| --布尔类
| |
| ['key_sound'] = TrueFalueMapping,
| |
| ['key_sound2'] = (function (value)
| |
| if value == true then
| |
| return 'true';
| |
| elseif value == false then
| |
| return 'false';
| |
| else
| |
| return value
| |
| end
| |
| end),
| |
| --字符串类
| |
| ['composer'] = (function (value)
| |
| return MappingValue('composer', value)
| |
| end),
| |
| }
| |
| | |
| -- 提供类型名称、键值名称来获取值。返回原始数据类型。
| |
| local function tryGetRawValue(valueType, targetName)
| |
| if type(keyMappingMethod[valueType]) == 'function' then
| |
| targetName = keyMappingMethod[valueType](targetName)
| |
| elseif type(valueTypes[valueType].keyMap) == 'string' then
| |
| targetName = MappingKey(targetName, valueTypes[valueType].keyMap)
| |
| end
| |
| if type(valueGettingMethod[valueType]) == 'function' then
| |
| return valueGettingMethod[valueType](targetName)
| |
| else
| |
| return ValueFromValuesByKey(GetValuesTable(valueType), targetName)
| |
| end
| |
| end
| |
| | |
| -- 提供类型名称、键值名称来获取值。返回值应当是字符串。
| |
| local function tryGetValue(valueType, targetName)
| |
| if valueTypes[valueType].rawOnly then
| |
| return string.format(
| |
| i18n['error_raw_only'],
| |
| valueType
| |
| )
| |
| end
| |
| local value = tryGetRawValue(valueType, targetName)
| |
| if type(valueMappingMethod[valueType]) == 'function' then
| |
| return valueMappingMethod[valueType](value)
| |
| else
| |
| return value
| |
| end
| |
| end | | end |
|
| |
|
| -- 获取值。
| | return p |
| local function GetValue(targetName, argType, argMode, nocat)
| |
| if not ValueTypeExist(argType) then
| |
| return '?[[Category:'..i18n['category_unknown_value_type']..']]'
| |
| end
| |
| | |
| local value
| |
| local category = ''
| |
| local result
| |
| value = tryGetValue(argType, targetName)
| |
| if value == nil then
| |
| if valueTypes[argType].noNullError then
| |
| value = i18n['none']
| |
| else value = '?'
| |
| end
| |
| end
| |
| --707 741
| |
| end
| |
本模块为自动表核心功能程序,根据输入的信息自动筛选数据。
数据库储存在Module:db_song,通过Template:db可以调用数据库中的信息,也可以通过Template:songlist生成自动表格。
local p = {}
function p.value(frame)
local args = frame.args
-- 遍历所有参数,查找模块名和键名
for paramName, paramValue in pairs(args) do
-- 检查参数格式是否为"模块名=键名"
if string.find(paramName, "=") then
local moduleName, key = string.match(paramName, "(.+)=(.+)")
if moduleName and key then
-- 动态加载指定模块
local success, moduleData = pcall(require, 'Module:' .. moduleName)
if success and moduleData then
-- 返回对应键的值
return tostring(moduleData[key] or '键不存在')
else
return '模块不存在或加载失败'
end
end
end
end
return '请使用格式: 模块名=键名'
end
return p