跳转到内容

模块:Db:修订间差异

来自DJMAX中文资料库
无编辑摘要
无编辑摘要
第1行: 第1行:
local p = {}
local p = {}
local valueTypes = mw.loadData('Module:db/types')


-- 1. 国际化和常量
local i18n = {
local i18n = {
['true'] = '是',
['true'] = '是',     -- 布尔值:真
['false'] = '否',
['false'] = '否',     -- 布尔值:假
['none'] = '\'\'无\'\'',
['none'] = '无',
['error_raw_only'] = '<span class="error">Autovalue:数据类型"%s"只能通过tryGetRawValue方法获取值。</span>',
['category_unknown_value_type'] = '未知自动值类型',
['category_missing_value'] = '缺失%s',
['category_missing_value'] = '缺失%s',
['content_or'] = '或',
['error_no_type'] = '<span class="error">Db:调用时必须提供type参数。</span>',
['grouping_others'] = '其他',
}
}


local function tableHasValue (targetTable, targetValue)
-- 2. 辅助函数
    for index, value in ipairs(targetTable) do
        if value == targetValue then
            return true
        end
    end
    return false
end
 
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)
-- 导入歌曲数据,从 Module:db_song 中获取数据表
return MappingValueFull('Module:db/' .. mappingName .. ' mapping', value)
local function GetValuesTable()
-- 从 Module:db_song 中获取数据。
    return mw.loadData('Module:db_song')
end
end


-- 从值列表按照键值获得值,找不到则返回nil。
local function ValueFromValuesByKey(values, key)
local function ValueFromValuesByKey(values, key)
local value = values[key]
if values and key then
--if value == nil then
return values[key]
-- value = values[key:gsub('s$', '')]
--end
if value == nil then
value = values['__fallback']
end
end
return value
return nil
end
end


-- 键映射方法。
-- 3. 值格式化方法 (valueMappingMethod)
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 EmptyStringToNone(value)
if value == '' then return i18n['none'] end
return value
end
 
-- 值映射方法,不设置则输出原值。
--数值类
local valueMappingMethod = {
local valueMappingMethod = {
['4b_nm_difficulty'] = FormatNumber,
    -- 格式化函数:将时长(秒)格式化为 'M:SS' 格式
--布尔类
    ['duration'] = (function (value)
['key_sound'] = TrueFalueMapping,
        if type(value) == 'number' then
['key_sound2'] = (function (value)
            local minutes = math.floor(value / 60)
if value == true then
            local seconds = value % 60
return 'true';
            return string.format('%d:%02d', minutes, seconds)
elseif value == false then
        end
return 'false';
        return value
else
    end),
return value
    -- 格式化函数:将艺术家名称自动链接
end
    ['artist'] = (function (value)
end),
        if type(value) == 'string' and value ~= '' then
--字符串类
            return '[[' .. value .. ']]'
['composer'] = (function (value)
        end
return MappingValue('composer', value)
        return value
end),
    end),
}
}


-- 提供类型名称、键值名称来获取值。返回原始数据类型。
-- 4. 外部调用函数 (p.value)
local function tryGetRawValue(valueType, targetName)
function p.value(f)
if type(keyMappingMethod[valueType]) == 'function' then
local args = f
targetName = keyMappingMethod[valueType](targetName)
local frame = mw.getCurrentFrame()
elseif type(valueTypes[valueType].keyMap) == 'string' then
if f == frame then
targetName = MappingKey(targetName, valueTypes[valueType].keyMap)
args = require('Module:ProcessArgs').merge(true)
end
end
if type(valueGettingMethod[valueType]) == 'function' then
   
return valueGettingMethod[valueType](targetName)
local argTargetName = mw.text.trim(args[1] or '') -- 歌曲ID (键名)
else
local argType = args.type                      -- 字段名 (type)
return ValueFromValuesByKey(GetValuesTable(valueType), targetName)
local argNocat = args.nocat                    -- 是否禁止分类追踪
end
   
end
    if not argType then
        return i18n['error_no_type']
    end
   
    -- 1. 加载歌曲数据
    local values = GetValuesTable()  
   
    -- 2. 获取目标歌曲条目
    local songEntry = ValueFromValuesByKey(values, argTargetName)


-- 提供类型名称、键值名称来获取值。返回值应当是字符串。
    if not songEntry then
local function tryGetValue(valueType, targetName)
        -- [处理歌曲ID缺失...]
if valueTypes[valueType].rawOnly then
        -- ... (代码省略,与之前版本相同)
return string.format(
        return i18n['none']
i18n['error_raw_only'],
    end
valueType
   
)
    -- 3. 从歌曲条目中获取特定字段的值
end
    local value = ValueFromValuesByKey(songEntry, argType)
local value = tryGetRawValue(valueType, targetName)
   
if type(valueMappingMethod[valueType]) == 'function' then
    if value == nil then
return valueMappingMethod[valueType](value)
        -- [处理特定字段的值缺失...]
        -- ... (代码省略,与之前版本相同)
        return i18n['none']
    end
   
    -- 4. 应用格式化
   
    -- **新增:优先级最高的布尔值转换**
    if type(value) == 'boolean' then
        if value then
            return i18n['true']
        else
            return i18n['false']
        end
    end
   
    -- 接下来应用字段特定的格式化
if type(valueMappingMethod[argType]) == 'function' then
return valueMappingMethod[argType](value)
else
else
return value
-- 转换为字符串输出
return tostring(value)
end
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

2025年11月29日 (六) 08:09的版本

本模块为自动表核心功能程序,根据输入的信息自动筛选数据。

数据库储存在Module:db_song,通过Template:db可以调用数据库中的信息,也可以通过Template:songlist生成自动表格。


local p = {}

-- 1. 国际化和常量
local i18n = {
	['true'] = '是',      -- 布尔值:真
	['false'] = '否',     -- 布尔值:假
	['none'] = '无',
	['category_missing_value'] = '缺失%s',
	['error_no_type'] = '<span class="error">Db:调用时必须提供type参数。</span>',
}

-- 2. 辅助函数

-- 导入歌曲数据,从 Module:db_song 中获取数据表
local function GetValuesTable()
	-- 从 Module:db_song 中获取数据。
    return mw.loadData('Module:db_song')
end

-- 从值列表按照键值获得值,找不到则返回nil。
local function ValueFromValuesByKey(values, key)
	if values and key then
		return values[key]
	end
	return nil
end

-- 3. 值格式化方法 (valueMappingMethod)
local valueMappingMethod = {
    -- 格式化函数:将时长(秒)格式化为 'M:SS' 格式
    ['duration'] = (function (value)
        if type(value) == 'number' then
            local minutes = math.floor(value / 60)
            local seconds = value % 60
            return string.format('%d:%02d', minutes, seconds)
        end
        return value
    end),
    -- 格式化函数:将艺术家名称自动链接
    ['artist'] = (function (value)
        if type(value) == 'string' and value ~= '' then
            return '[[' .. value .. ']]'
        end
        return value
    end),
}

-- 4. 外部调用函数 (p.value)
function p.value(f)
	local args = f
	local frame = mw.getCurrentFrame()
	if f == frame then
		args = require('Module:ProcessArgs').merge(true)
	end
    
	local argTargetName = mw.text.trim(args[1] or '') -- 歌曲ID (键名)
	local argType = args.type                       -- 字段名 (type)
	local argNocat = args.nocat                     -- 是否禁止分类追踪
    
    if not argType then
        return i18n['error_no_type']
    end
    
    -- 1. 加载歌曲数据
    local values = GetValuesTable() 
    
    -- 2. 获取目标歌曲条目
    local songEntry = ValueFromValuesByKey(values, argTargetName)

    if not songEntry then
        -- [处理歌曲ID缺失...]
        -- ... (代码省略,与之前版本相同)
        return i18n['none']
    end
    
    -- 3. 从歌曲条目中获取特定字段的值
    local value = ValueFromValuesByKey(songEntry, argType)
    
    if value == nil then
        -- [处理特定字段的值缺失...]
        -- ... (代码省略,与之前版本相同)
        return i18n['none'] 
    end
    
    -- 4. 应用格式化
    
    -- **新增:优先级最高的布尔值转换**
    if type(value) == 'boolean' then
        if value then
            return i18n['true']
        else
            return i18n['false']
        end
    end
    
    -- 接下来应用字段特定的格式化
	if type(valueMappingMethod[argType]) == 'function' then
		return valueMappingMethod[argType](value)
	else
		-- 转换为字符串输出
		return tostring(value)
	end
end

return p