Документацію для цього модуля можна створити у Модуль:Зброя/дані/документація
--- WARFRAME weapon database to be used on the wiki.
--
-- @module weapons/data
-- @alias data
-- @attribution [[User:FINNER|FINNER]]
-- @attribution [[User:Cephalon Scientia|Cephalon Scientia]]
-- @attribution Everyone who contributes to adding new data or updating existing values in database
--- @require [[Module:LuaSerializer]]
-- @release stable
-- <nowiki>
-- TODO: Since horizontal partitions are accessed programmatically, this means
-- that this module can be tailored to serve specific user localizations.
-- All we need to do is to add a locale flag in here set to mw.getCurrentFrame():preprocess('{{int:Custom-lang}}'),
-- a separate translation table (likely JSON) for mapping canonical internal names to localized names,
-- and replace the Name key/Trigger key/index key with the localized counterpart.
-- In theory, any database access by requiring this module should contain the
-- proper localization based on user's interface language setting.
local data = {}
local MODULE_LOCALIZATION = mw.site.namespaces[828].name
local COOP_SLOTS = {'основна', 'допоміжна', 'холодна', 'арквінґ', 'супутник', 'рейкоджек', 'модульна', 'різне'}
local SLOTS_MAP = {
['Основна зброя'] = 'основна',
['Допоміжна зброя'] = 'допоміжна',
['Холодна зброя'] = 'холодна',
['Арквінґ'] = 'арквінґ',
['Арк-гармата (атмосфера)'] = 'арквінґ',
['Холодна арк-зброя'] = 'арквінґ',
['Арк-гармата'] = 'арквінґ',
['Супутник'] = 'супутник',
['Роботи'] = 'супутник',
['Гончак'] = 'супутник',
['Рейкоджек'] = 'рейкоджек',
['Турель рейкоджека'] = 'рейкоджек',
--['Носова гармата'] = 'рейкоджек',
['Модульна'] = 'модульна',
['Підсилювач'] = 'модульна',
['Зо'] = 'модульна',
['Складостріл'] = 'модульна',
['Різне'] = 'різне',
['Розміщення'] = 'різне',
['Спорядження'] = 'різне',
['Холодна зброя некрамех'] = 'різне',
['Унікальний'] = 'різне',
['Риболовний гарпун'] = 'різне',
['Техніка'] = 'різне',
}
-- Defining default metatable values
local dbMetatable = {
-- Page title of database
_pageName = 'Зброя/дані',
}
dbMetatable._pageTitle = MODULE_LOCALIZATION..':'..dbMetatable._pageName
--- Defining custom looping behavior with pairs() to iterate over multiple
-- partitions while acting as one database table.
-- @function data.__pairs
-- @param {table} self Table self-reference
-- @return {function} Iterator function
-- @return {table} Contains key-pair values of slot names to corresponding horizontal partition
dbMetatable.__pairs = function(self)
local temp = {}
local slots = COOP_SLOTS
for i, slot in ipairs(slots) do
temp[i] = mw.loadData(getmetatable(self)._pageTitle..'/'..slot)
end
function next(t, key)
return pairs(t)(t, key)
end
function __next(t, key)
if not key then
return next(t[1])
else
for i = 1, #t - 1 do
if t[i][key] then
if next(t[i], key) then
return next(t[i], key)
else
return next(t[i + 1])
end
end
end
return next(t[#t], key)
end
end
return __next, temp, nil
end
--- Supporting indexing by slot name (returns array of weapon entries) or weapon name
-- (returns a weapon entry).
-- @function data.__index
-- @param {table} self Table self-reference
-- @param {string} key Index key
-- @return {table}
dbMetatable.__index = function(self, key)
if (type(key) == 'number') then return nil end
-- Indexing by slot
if key and SLOTS_MAP[key:lower()] then
return mw.loadData(getmetatable(self)._pageTitle..'/'..SLOTS_MAP[key:lower()])
end
local slots = COOP_SLOTS
-- Indexing by weapon name
local weapon
for _, slot in ipairs(slots) do
weapon = mw.loadData(getmetatable(self)._pageTitle..'/'..slot)[key]
if weapon then
return weapon
end
end
return nil
end
--- For changing which type of database to pull data from.
-- If you want to switch to a different database in the same script, must require()
-- a new instance of M:Weapons/data.
-- @function __call
-- @usage require('Module:Weapons/data')(true)
-- @param {table} self Table self-reference
-- @param {table} args Argument table
-- @return {table} Database table
dbMetatable.__call = function(self, args)
-- Define logic for additional named arguments before the return statement
-- TODO: We can take advantage of calling a database table by adding additional arguments
-- for filtering out content.
return self
end
--- Serializes database tables into a single string with no functions and metatables.
-- @function __tostring
-- @param {table} self Table self-reference
-- @return {string} Serialized database
dbMetatable.__tostring = function(self)
return require('Модуль:LuaSerializer')._serialize(getmetatable(self)._pageName)
end
setmetatable(data, dbMetatable)
return data