Модуль:Loc: различия между версиями

Материал из Space Station 14 Вики
Нет описания правки
мНет описания правки
 
(не показана 1 промежуточная версия этого же участника)
Строка 1: Строка 1:
local data = mw.loadData("Модуль:IanComradeBot/loc/data")
local data = mw.loadData("Модуль:IanComradeBot/loc.json/data")


local p = {}
local p = {}
-- индекс для регистронезависимого поиска
local lowerIndex = nil


local function tolower(s)
local function tolower(s)
Строка 10: Строка 7:
end
end


local function buildLowerIndex()
local complexLowerIndex = nil
     if lowerIndex then return end
 
     lowerIndex = {}
local function buildComplexIndex()
     if complexLowerIndex then return end
     complexLowerIndex = {}
     for k, v in pairs(data) do
     for k, v in pairs(data) do
         if type(k) == "string" then
         if type(v) == "table" and type(k) == "string" then
             local lk = tolower(k)
             local lk = tolower(k)
             if not lowerIndex[lk] then
             if not complexLowerIndex[lk] then
                 lowerIndex[lk] = v
                 complexLowerIndex[lk] = v
             end
             end
         end
         end
Строка 23: Строка 22:
end
end


-- Возвращает значение по ключу
local function getValueFromEntry(entry, subkey)
local function getValueByKeyRaw(value, subkey)
     if entry == nil then return nil end
     if value == nil then return nil end
     local t = type(entry)
     local t = type(value)
     if t == "string" then
     if t == "string" then
         return value
         return entry
     elseif t == "table" then
     elseif t == "table" then
         if subkey and value[subkey] then
         if subkey then
             return value[subkey]
            return entry[subkey]
        else
             return entry["_value"]
         end
         end
        return nil
     end
     end
     return nil
     return nil
end
end


-- Основной поиск
local function findTextByKeyOptimized(key, subkey)
local function findTextByKey(key, subkey)
     if not key then return nil end
     if not key then return nil end


     local direct = data[key]
     local direct = data[key]
     local result = getValueByKeyRaw(direct, subkey)
     local r = getValueFromEntry(direct, subkey)
     if result then return result end
     if r then return r end


     buildLowerIndex()
     buildComplexIndex()
     local lk = tolower(key)
     local lk = tolower(key)
     local v = lowerIndex[lk]
     local complexEntry = complexLowerIndex[lk]
     result = getValueByKeyRaw(v, subkey)
     if complexEntry then
    if result then return result end
        local rr = getValueFromEntry(complexEntry, subkey)
        if rr then return rr end
    end


     return nil
     return nil
Строка 63: Строка 63:
     end
     end


     local result = findTextByKey(key, subkey)
     local result = findTextByKeyOptimized(key, subkey)


     if not result then
     if not result then
Строка 80: Строка 80:
     end
     end


     local result = findTextByKey(key, subkey)
     local result = findTextByKeyOptimized(key, subkey)
 
     if not result then
     if not result then
         return key
         return key

Текущая версия от 17:57, 24 февраля 2026

Для документации этого модуля может быть создана страница Модуль:Loc/doc

local data = mw.loadData("Модуль:IanComradeBot/loc.json/data")

local p = {}

local function tolower(s)
    return s and mw.ustring.lower(s) or s
end

local complexLowerIndex = nil

local function buildComplexIndex()
    if complexLowerIndex then return end
    complexLowerIndex = {}
    for k, v in pairs(data) do
        if type(v) == "table" and type(k) == "string" then
            local lk = tolower(k)
            if not complexLowerIndex[lk] then
                complexLowerIndex[lk] = v
            end
        end
    end
end

local function getValueFromEntry(entry, subkey)
    if entry == nil then return nil end
    local t = type(entry)
    if t == "string" then
        return entry
    elseif t == "table" then
        if subkey then
            return entry[subkey]
        else
            return entry["_value"]
        end
    end
    return nil
end

local function findTextByKeyOptimized(key, subkey)
    if not key then return nil end

    local direct = data[key]
    local r = getValueFromEntry(direct, subkey)
    if r then return r end

    buildComplexIndex()
    local lk = tolower(key)
    local complexEntry = complexLowerIndex[lk]
    if complexEntry then
        local rr = getValueFromEntry(complexEntry, subkey)
        if rr then return rr end
    end

    return nil
end

function p.GetString(frame)
    local key = frame.args[1]
    local subkey = frame.args[2] or "_value"

    if not key then
        return "Ошибка: Не указаны все необходимые параметры."
    end

    local result = findTextByKeyOptimized(key, subkey)

    if not result then
        return key
    end

    return frame:preprocess("{{#invoke:Loc/Marking|main|<nowiki>".. result .. "</nowiki>}}")
end

function p.GetRawString(frame)
    local key = frame.args[1]
    local subkey = frame.args[2] or "_value"

    if not key then
        return "Ошибка: Не указаны все необходимые параметры."
    end

    local result = findTextByKeyOptimized(key, subkey)

    if not result then
        return key
    end

    return frame:preprocess("<nowiki>".. result .. "</nowiki>")
end

return p