首页
随机
登录
设置
关于DJMAX中文资料库
免责声明
DJMAX中文资料库
搜索
查看“︁模块:Db”︁的源代码
←
模块:Db
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
local p = {} -- [[------------------------------------------------------------------]] -- [[ 1. 国际化和常量 ]] -- [[------------------------------------------------------------------]] local i18n = { ['true'] = '是', ['false'] = '否', ['none'] = '无', ['category_missing_value'] = '缺失%s', ['error_no_type'] = '<span class="error">Db:调用时必须提供type参数。</span>', ['error_find_keys_args'] = '<span class="error">Db:findKeysByValue必须提供field和value参数。</span>', ['error_generate_table_args'] = '<span class="error">Db:generateListTable调用缺少field, value或columns参数。</span>', } -- [[------------------------------------------------------------------]] -- [[ 2. 表格标题映射 ]] -- [[------------------------------------------------------------------]] local displayNames = { ['title'] = '歌曲标题', ['artist'] = '艺术家', ['duration'] = '时长', ['is_featured'] = '精选', ['genre'] = '流派', ['id'] = '歌曲ID', -- 4B 字段 ['4b_nm'] = '4B NM', ['4b_nm_notes'] = '4B NM按键数', ['4b_hd'] = '4B HD', ['4b_hd_notes'] = '4B HD按键数', ['4b_mx'] = '4B MX', ['4b_mx_notes'] = '4B MX按键数', ['4b_sc'] = '4B SC', ['4b_sc_notes'] = '4B SC按键数', -- 5B 字段 ['5b_nm'] = '5B NM', ['5b_nm_notes'] = '5B NM按键数', ['5b_hd'] = '5B HD', ['5b_hd_notes'] = '5B HD按键数', ['5b_mx'] = '5B MX', ['5b_mx_notes'] = '5B MX按键数', ['5b_sc'] = '5B SC', ['5b_sc_notes'] = '5B SC按键数', -- 6B 字段 ['6b_nm'] = '6B NM', ['6b_nm_notes'] = '6B NM按键数', ['6b_hd'] = '6B HD', ['6b_hd_notes'] = '6B HD按键数', ['6b_mx'] = '6B MX', ['6b_mx_notes'] = '6B MX按键数', ['6b_sc'] = '6B SC', ['6b_sc_notes'] = '6B SC按键数', -- 8B 字段 ['8b_nm'] = '8B NM', ['8b_nm_notes'] = '8B NM按键数', ['8b_hd'] = '8B HD', ['8b_hd_notes'] = '8B HD按键数', ['8b_mx'] = '8B MX', ['8b_mx_notes'] = '8B MX按键数', ['8b_sc'] = '8B SC', ['8b_sc_notes'] = '8B SC按键数', } -- [[------------------------------------------------------------------]] -- [[ 3. 本地辅助函数定义 (Local Helper Functions) ]] -- [[ 这些函数必须在 p.value 等公共函数之前定义。]] -- [[------------------------------------------------------------------]] local function GetValuesTable() return mw.loadData('Module:db_song') end local function ValueFromValuesByKey(values, key) if values and key then return values[key] end return nil end -- 格式化单个值的私有函数 (重点:确保此定义被包含) local function formatSingleValue(value, fieldType) if value == nil then return i18n['none'] elseif type(value) == 'boolean' then return value and i18n['true'] or i18n['false'] -- 注意:这里调用了 p.valueMappingMethod,它在 p 被返回之前完成定义 elseif type(p.valueMappingMethod[fieldType]) == 'function' then return p.valueMappingMethod[fieldType](value) else return tostring(value) end end -- 4. 值格式化方法 (valueMappingMethod) p.valueMappingMethod = { ['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), } -- [[------------------------------------------------------------------]] -- [[ 5. 外部调用函数 (p.*) ]] -- [[------------------------------------------------------------------]] -- p.value 函数体(调用 formatSingleValue) 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 '') local argTypeString = args.type local argNocat = args.nocat if not argTypeString then return i18n['error_no_type'] end local values = GetValuesTable() local songEntry = ValueFromValuesByKey(values, argTargetName) if not songEntry then if not argNocat then local title = mw.title.getCurrentTitle() if title.namespace == 0 and not title.isSubpage then return '?' .. '[[Category:' .. string.format(i18n['category_missing_value'], '歌曲ID ' .. argTargetName) .. ']]' end end return i18n['none'] end local fieldNames = mw.text.split(argTypeString, ',') local resultTable = {} for _, argType in ipairs(fieldNames) do argType = mw.text.trim(argType) local value = ValueFromValuesByKey(songEntry, argType) -- 调用本地函数 local formattedValue = formatSingleValue(value, argType) table.insert(resultTable, formattedValue) end return table.concat(resultTable, ' / ') end -- p.findKeysByValue 函数体 function p.findKeysByValue(f) local args = f local frame = mw.getCurrentFrame() if f == frame then args = require('Module:ProcessArgs').merge(true) end local targetField = mw.text.trim(args.field or '') local targetValue = args.value if type(targetValue) == 'string' then targetValue = mw.text.trim(targetValue) end if targetField == '' or targetValue == nil then return i18n['error_find_keys_args'] end local songData = GetValuesTable() local matchingKeys = {} for songId, songEntry in pairs(songData) do local currentValue = ValueFromValuesByKey(songEntry, targetField) if currentValue == targetValue then table.insert(matchingKeys, songId) end end table.sort(matchingKeys) return table.concat(matchingKeys, ', ') end -- p.generateListTable 函数体(调用 formatSingleValue) function p.generateListTable(f) local args = require('Module:ProcessArgs').merge(true) local conditionField = mw.text.trim(args.field or '') local conditionValue = args.value local displayFieldsString = mw.text.trim(args.columns or '') -- 优化:预处理 conditionValue 的类型 if type(conditionValue) == 'string' then local trimmedValue = mw.text.trim(conditionValue) local lowerValue = string.lower(trimmedValue) if lowerValue == 'true' or trimmedValue == '是' then conditionValue = true elseif lowerValue == 'false' or trimmedValue == '否' then conditionValue = false else local num = tonumber(trimmedValue) if num ~= nil then conditionValue = num else conditionValue = trimmedValue end end end if conditionField == '' or conditionValue == nil or displayFieldsString == '' then return i18n['error_generate_table_args'] end local songData = GetValuesTable() local displayFields = mw.text.split(displayFieldsString, ',') local matchingKeys = {} -- 查找匹配的键 for songId, songEntry in pairs(songData) do local currentValue = ValueFromValuesByKey(songEntry, conditionField) if currentValue == conditionValue then table.insert(matchingKeys, songId) end end table.sort(matchingKeys) if #matchingKeys == 0 then return '未找到符合条件的歌曲。' end local output = {} -- 构造表格头部 table.insert(output, '{| class="wikitable sortable"') table.insert(output, '|-') table.insert(output, '! ' .. (displayNames['id'] or 'ID')) for _, field in ipairs(displayFields) do field = mw.text.trim(field) table.insert(output, '! ' .. (displayNames[field] or field)) end -- 构造表格行 for _, songId in ipairs(matchingKeys) do local songEntry = songData[songId] table.insert(output, '|-') table.insert(output, '| ' .. songId) for _, field in ipairs(displayFields) do field = mw.text.trim(field) local rawValue = ValueFromValuesByKey(songEntry, field) -- 调用本地函数 local formattedValue = formatSingleValue(rawValue, field) table.insert(output, '| ' .. formattedValue) end end table.insert(output, '|}') return table.concat(output, '\n') end return p
该页面使用的模板:
模块:Db/doc
(
查看源代码
)
返回
模块:Db
。