Warframe вики
Advertisement
Warframe вики
5861
страница
Модуль:Мод
Данные

Модуль для автоматизации работы с модами. Аналог Module:Mods с англовики. Использует базу данных Модуль:Мод/Данные

Список функций

Функции для внешнего вызова:

printModRow()         - функция отладки
buildGenericGallery() - строит процедурную галерею по указанным параметрам
buildGenericNavbox()  - строит процедурную таблицу по указанными параметрам
printSelf()           - печатает часть Базы Данных указанного типа, для упрощения одновления БД
stats()               - выводит статистику БД

Функции интеграций с шаблонами:

templateModIntegration()
templateSimilarModsIntegration()
templateSimilarModsAuto()
templateNavboxShell()

Функции работы инфобокса:

modInfobox()
getValue()
modCategories()
modImage()
modSyndicate()
modTax()
modType()

Служебные функции:

buildGallery()
getFilteredTableStack()
checkAltMisc()
checkAltTypes()
containsFork()
getEmSubtypes()
getFilteredTable()
getMod()
getModCount()
ifModExists()
importAndGetMod()
importFromTemplate()
importStackFromTemplate()
modInfobox()
toNil()
tooltip()
tooltiptext()
modString()
prefixIcons()
requestModString()

Используется шаблонами

(Модуль:Мод/doc)


--Исходно взято с англовики Module:Mods 12.05.2020

local p = {}

local ModData = mw.loadData('Модуль:Мод/Данные')
local Shared = require('Модуль:Функции')
local Icons = require('Модуль:Иконка')

cat_error = '[[Категория:Ошибка Мод инфобокс]]'

local tl = {['Название']        = 'Name',             -- таблица транслитерации
            ['Переход']         = 'Ename',
            ['Изображение']     = 'Image',
            ['Полярность']      = 'Polarity',
            ['Редкость']        = 'Rarity',
            ['Тип']             = 'Type',
            ['Подтип']          = 'Subtype',
            ['Режим']           = 'Mode',
            ['Эксилус']         = 'Exilus',
            ['Преобразование']  = 'Transmutable',
            ['Ссылка']          = 'Link',
            ['Налог']           = 'Tradetax',
            ['Выведен']         = 'Exclude',
    }

function p.test(frame)
    if type(frame)=='table' then ModName = frame.args[1]
    elseif type(frame)=='string' then ModName = frame end
    local Mod = getMod(ModName)

    return mw.title.new(ModName..'_вики.png', "Файл").exists
    end

----------------------------------------------------------------
------------------------Возвращает картинку Мода по его названию
----------------------------(используется в Шаблон:Мод инфобокс)
----------------------------------------------------------------
function p.modImage(frame)
    if type(frame)=='table' then ModName = frame.args[1]
    elseif type(frame)=='string' then ModName = frame end
    local Mod = getMod(ModName)
    local ttlo = mw.title.new(ModName..'_вики.png', "Файл")
    local cart ='[[Категория:Моды]]'
    
    if ifModExists(ModName,Mod) and Mod.Exclude then cart = '' end
    if mw.ustring.find(ModName,'Прайм') ~= nil then
        cart = cart..'[[Категория:Прайм моды]]'
    end
    
    if ModName and ifModExists(ModName,Mod) and Mod.Image then 
        if mw.title.new(Mod.Image, "Файл").exists 
            then cart = cart..'[[Файл:'..Mod.Image..'|x300px|center|middle]]'
            else cart = cart..'[[Файл:Мод_рамка_вики.png|x300px|center|middle|link=Файл:'..Mod.Image..']]'
            end
        elseif ttlo.exists then cart = cart..'[[Файл:'..ModName..'_вики.png|x300px|center|middle]]'
        else cart = cart..'[[Файл:Мод_рамка_вики.png|x300px|center|middle|link=Файл:'..ModName..'_вики.png]]'
    end
    
    if toNil(ModName)==nil then
        cart = cart..'<br /><span style="color:red; font-weight:bold;">ОШИБКА: Не указано название Мода</span>'..cat_error
    elseif not ifModExists(ModName,Mod) then
        if not ttlo.exists then
            cart = cart..'<br /><span style="color:red; font-weight:bold;">ОШИБКА: [[:Файл:'..ModName..'_вики.png|Изображение не загружено]]'..cat_error
        else
            cart = cart..'<br /><span style="color:red; font-weight:bold;">ОШИБКА: Данный Мод не найден в базе модов [[:Модуль:Мод/Данные]]</span>'..cat_error
        end
    elseif ifModExists(ModName,Mod) and Mod.Image and not mw.title.new(Mod.Image, "Файл").exists then cart = cart..'<br /><span style="color:red; font-weight:bold;">ОШИБКА: [[:Файл:'..Mod.Image..'|Изображение указанное в Базе Данных не загружено]]'..cat_error
    end
    return cart

end

----------------------------------------------------------------
-------------------------Возвращает о возможности преобразования
----------------------------(используется в Шаблон:Мод инфобокс)
----------------------------------------------------------------
function p.modTransmutable(frame)
    local ModName
    if type(frame)=='table' then ModName = frame.args[1]
    elseif type(frame)=='string' then ModName = frame end
    local Mod = getMod(ModName)

    if ModName == nil or not ifModExists (ModName, Mod) then return nil
    elseif Mod.Transmutable == nil or Mod.Transmutable then
        return '[[Преобразование|<span style="color: #fff; font-weight: 700; font-size: 1em;">Преобразуется</span>]][[Категория:Трансмутируемые моды]]'
    else 
        return '[[Преобразование|<span style="color: #ff5454; font-weight: 700;	font-size: 1em;">Не преобразуется</span>]][[Категория:Нетрансмутируемые моды]]'
    end
end

----------------------------------------------------------------
----------------------Возвращает информацию по налогу при обмене 
----------------------------(используется в Шаблон:Мод инфобокс)
----------------------------------------------------------------
function p.modTax(frame)
    local ModName
    if type(frame)=='table' then ModName = frame.args[1]
    elseif type(frame)=='string' then ModName = frame end
    local Mod = getMod(ModName)

    if ModName == nil or not ifModExists (ModName, Mod) or Mod.Rarity == nil then return nil end
    
    if Mod.Tradetax then return Mod.Tradetax
    elseif Mod.Rarity == 'Обычный'     then price_ = 2000    cat_ = '[[Категория:'..Mod.Rarity..']]'
    elseif Mod.Rarity == 'Необычный'   then price_ = 4000    cat_ = '[[Категория:'..Mod.Rarity..']]'
    elseif Mod.Rarity == 'Редкий'      then price_ = 8000    cat_ = '[[Категория:'..Mod.Rarity..']]'
    elseif Mod.Rarity == 'Легендарный' then price_ = 1000000 cat_ = '[[Категория:'..Mod.Rarity..']]'
    elseif Mod.Rarity == 'Особенный'   then price_ = 4000    cat_ = '[[Категория:Особенные моды]]'
    elseif Mod.Rarity == 'Амальгама'   then price_ = 0       cat_ = '[[Категория:'..Mod.Rarity..' моды]]'
    else 
        return ''
    end
    return Icons.Item('Кредиты', price_)..cat_
end

----------------------------------------------------------------
-------------------------Возвращает название оружия Аугмент мода
----------------------------(Упразднена. Требуется удалить, если где-то используется.)
----------------------------------------------------------------
function p.modWeapon(frame)

end

----------------------------------------------------------------
----------------------Возвращает название варфрейма Аугмент мода
----------------------------(Упразднена. Требуется удалить, если где-то используется.)
----------------------------------------------------------------
function p.modWarframe(frame)

end

----------------------------------------------------------------
------------Возвращает режима игры, где может использоваться мод
----------------------------(используется в Шаблон:Мод инфобокс)
----------------------------------------------------------------
function p.modMode(frame)
    if type(frame)=='table' then ModName = frame.args[1]
    elseif type(frame)=='string' then ModName = frame end
    local Mod = getMod(ModName)

    if not ifModExists (ModName, Mod) then return nil end
    
    if Mod.Mode == 'Все' then return 'Кооператив<br/>[[Конклав]]'
    elseif Mod.Mode == 'Конклав' then return '[[Конклав]]'
    else return 'Кооператив'
    end
end

----------------------------------------------------------------
----------------------------Возвращает название мода при наличии
----------------------------(используется в Шаблон:Мод инфобокс)
----------------------------------------------------------------
function p.modName(frame)
    if type(frame)=='table' then ModName = frame.args[1]
    elseif type(frame)=='string' then ModName = frame end
    local Mod = getMod(ModName)

    if not ifModExists (ModName, Mod) then return nil end
    
    if Mod.Name ~= nil and Mod.Name ~= '' then return Mod.Name 
    else return ModName end
end

----------------------------------------------------------------
--------------------Возвращает Тип и Подтип Мода по его названию
----------------------------(используется в Шаблон:Мод инфобокс)
----------------------------------------------------------------
function p.modType(frame)
    if type(frame)=='table' then ModName = frame.args[1]
    elseif type(frame)=='string' then ModName = frame end
    local Mod = getMod(ModName)
    
    if not ifModExists (ModName, Mod) then return nil end
    
    type_ = ''
    -----------------------------------
    if Mod.Type == 'Варфрейм' then 
        if Mod.Subtype == 'Аура' then type_ = '[[Ауры|Аура]][[Категория:Ауры]]'
        else type_ = '[[:Категория:Моды_Варфреймов|Мод варфрейма]][[Категория:Моды_Варфреймов]]'
        end
    -----------------------------------
    elseif Mod.Type == 'Основное оружие' then 
        if Mod.Subtype == 'Винтовка' then type_ = '[[:Категория:Моды винтовок|Мод винтовки]][[Категория:Моды винтовок]]'
        elseif Mod.Subtype == 'Дробовик' then type_ = '[[:Категория:Моды дробовика|Мод дробовика]][[Категория:Моды дробовика]]'
        elseif Mod.Subtype == 'Снайперская винтовка' then type_ = '[[:Категория:Моды снайперского оружия|Мод снайперской винтовки]][[Категория:Моды снайперского оружия]]'
        elseif Mod.Subtype == 'Лук' then type_ = '[[:Категория:Моды луков|Мод лука]][[Категория:Моды луков]]'
        elseif Mod.Subtype == 'Установка' then type_ = '[[:Категория:Моды установок|Мод лука]][[Категория:Моды установок]]'
        else type_ = 'Мод Основного оружия[[Категория:Моды винтовок]][[Категория:Моды дробовика]]'
        end
    -----------------------------------    
    elseif Mod.Type == 'Вторичное оружие' then 
        if Mod.Subtype == 'Метательное' then type_ = '[[:Категория:Моды метательного|Мод метательного]][[Категория:Моды метательного]]'
        else type_ = '[[:Категория:Моды_пистолета|Мод пистолета]][[Категория:Моды_пистолета]]'
        end
    -----------------------------------
    elseif Mod.Type == 'Холодное оружие' then 
        if Mod.Subtype == 'Стойка' then type_ = '[[:Категория:Стойки|Стойка]][[Категория:Стойки]]'
        elseif Mod.Subtype == 'Глефа' then type_ = '[[Глефы#Стойки и моды|Мод глеф]][[Категория:Моды глефы]]'
        elseif Mod.Subtype == 'Кинжал' then type_ = '[[:Категория:Моды кинжалов|Мод кинжалов]][[Категория:Моды кинжалов]]'
        else type_ = '[[:Категория:Моды_холодного_оружия|Мод ближнего боя]][[Категория:Моды_холодного_оружия]]'
       end
    -----------------------------------
    elseif Mod.Type == 'Компаньон' then
        type_ = '[[:Категория:Моды Компаньонов|Мод компаньона]][[Категория:Моды Компаньонов]]'
    -----------------------------------
    elseif Mod.Type == 'Заповедь' then
         type_ = '[[:Категория:Заповедь|Заповедь компаньона]][[Категория:Заповедь]]'
    -----------------------------------    
    elseif Mod.Type == 'Арчвинг' then type_ = '[[:Категория:Арчвинг_моды|Мод арчвинга]][[Категория:Арчвинг_моды]]'
    elseif Mod.Type == 'Основное оружие арчвинг' then type_ = '[[:Категория:Мод оружия арчвинга|Мод Арч-основного]][[Категория:Мод оружия арчвинга]]'
    elseif Mod.Type == 'Холодное оружие арчвинг' then type_ = '[[:Категория:Мод арч-ближнего боя|Мод Арч-ближнего]][[Категория:Мод арч-ближнего боя]]'
    -----------------------------------
    elseif Mod.Type == 'Аугмент' then 
        type_ = '[[:Категория:Моды-аугменты|Мод-аугмент]][[Категория:Моды-аугменты]]'
    elseif Mod.Type == 'Аугмент оружия' then
        type_ = '[[:Категория:Моды-аугменты_оружия|Мод-аугмент оружия]][[Категория:Моды-аугменты_оружия]]'
    -----------------------------------
    elseif Mod.Type == 'К-Драйв' then type_ = '[[:Категория:Моды_К-Драйва|Мод К-Драйва]][[Категория:Моды_К-Драйва]]'
    -----------------------------------
    elseif Mod.Type == 'Паразон' then
        if Mod.Subtype == 'Реквием' then type_ = '[[:Категория:Реквием|Реквием-мод]][[Категория:Реквием]]'
            else type_ = '[[:Категория:Моды паразона|Мод паразона]][[Категория:Моды паразона]]'
        end
    -----------------------------------
    elseif not toNil(Mod.Type) then type_ = Mod.Type
    else type_ = '[[:Категория:Ошибка Мод инфобокс|Ошибка базы данных]]'..cat_error
    end
   
    if Mod.Exilus then type_ = type_..'<br/>'..Icons.Pol("Эксилус","Эксилус мод")..'[[Категория:Эксилус мод]]' end
    return type_
end

----------------------------------------------------------------
--------Возвращает ссылку на англ. страницу Мода по его названию
----------------------------(используется в Шаблон:Мод инфобокс)
----------------------------------------------------------------
function p.modEname(frame)
    local ModName
    if type(frame)=='table' then ModName = frame.args[1]
    elseif type(frame)=='string' then ModName = frame end

    local Mod = getMod(ModName)
    if ModName == nil or not ifModExists (ModName, Mod) then return nil
    elseif Mod.Ename ~= nil then return '[[en:'..Mod.Ename..']]' end
end

----------------------------------------------------------------
------------------Возвращает список синдикатов для аугмент Модов
----------------------------(используется в Шаблон:Мод инфобокс)
----------------------------------------------------------------
function p.modSyndicate(frame)
    local ModName
    if type(frame)=='table' then ModName = frame.args[1]
    elseif type(frame)=='string' then ModName = frame end
    local Mod = getMod(ModName)
 
    local title = '<span style="font-weight:bold;">Синдикаты:</span><br />'
 
    if (ModName == nil or not ifModExists (ModName,Mod) or Mod.Syndicates == nil or type(Mod.Syndicates) ~= 'table' or Shared.tableCount(Mod.Syndicates) == 0) then return ''
    end
 
    local synResult = ''
    for i, _syn in pairs(Mod.Syndicates) do
        syn = _syn[1]
        if _syn[2] == nil or _syn[2] == '' then point = ''
        else point = ': '..Icons.Item('Очки Синдиката',_syn[2]) end
        if syn == 'Конклав' and (_syn[2] == nil or _syn[2] == '') then
            synResult = synResult..'Награда за '..Icons.Syn(syn, syn)..' миссии [[Категория: Конклав моды]]<br/>'
        else synResult = synResult..Icons.Syn(syn, syn)..point..'[[Категория: Моды синдиката '..syn..']]<br />'
        end
    end
    return title..synResult
end

----------------------------------------------------------------
-------------------------Возвращает требуемую информацию по Моду 
----------------------------(используется в Шаблон:Мод инфобокс)
----------------------------------------------------------------
function p.getValue(frame)
    local ModName = frame.args[1]
    local ValName = frame.args[2]
    local Mod = getMod(ModName)
    
    if ModName == nil then
        return 'ОШИБКА: Не указано название Мода'
    elseif ValName == nil then
        return 'ОШИБКА: Параметр не указан'
    --elseif tl[ValName] == nil then 
    --    return 'ОШИБКА: Указан неверный параметр'
    elseif not ifModExists (ModName,Mod) then return nil
    end
    
    if ValName == 'Название' then
        return ModName[Name]
    elseif ValName == 'ПолярностьИконка' then
        if Mod.Polarity == '-' then
            return '-'
        elseif Mod.Polarity ~= nil then
            return Icons.Pol(Mod.Polarity)..'[[Категория:'..Mod.Polarity..']]'
        else
            return 'Отсутствует'
        end
    elseif ValName == 'Налог'  then
        return p.modTax(ModData[Mod])
    elseif ValName == 'Преобразование'  then
        if Mod.Transmutable ~= nil then
            if Mod.Transmutable  then
                return '[[Преобразование|<span style="color:green">Преобразуется</span>]][[Категория:Трансмутируемые моды]]'
            else
                return '[[Преобразование|<span style="color:red">Не преобразуется</span>]][[Категория:Нетрансмутируемые моды]]'
            end
        else
            return '[[Преобразование|<span style="color:green">Преобразуется</span>]][[Категория:Трансмутируемые моды]]'
        end
    elseif ValName == 'Получение' then
        if Mod.Syndicates ~= nil then
            return Mod.Syndicates[1]..', '..Mod.Syndicates[2]
        else
            return 'Ошибка'
        end
    else
        for ru, en in Shared.skpairs(tl) do
            if mw.ustring.upper(ru)==mw.ustring.upper(ValName) then
            return Mod[tl[ValName]] or 'Отсутствует' end 
        end
    end
end

-- Фильтрует моды в соответствии с аргументами и выводит список викитекстом
-- Для обновление таблиц вручную? Может пригодиться?
-- Подразумевает доступ к коду, чтобы изменить шаблон в table.insert на желаемый.
-- Для отображения [ и ] используйте &#91; и &#93; соответственно.
function p.printModRow(frame)
    local cart ={}
    local filteredTable = p.getFilteredTable(frame)
    
    for i, modName in Shared.skpairs(filteredTable) do
        Mod=ModData[modName]
        if Mod.Name ~= nil and Mod.Name ~= '' then
            name_ = Mod.Name
        else name_ = Mod
        end
        table.insert(cart, '{{Мод|'..name_..'}}')
    end
    return table.concat(cart, ' •&nbsp;')
end
    
----------------------------------------------------------------
------------------------------------Возвращает Мод из базы модов
----------------------------------------------------------------
function getMod(name)
    local _mod = ModData[name]
    if _mod ~= nil and _mod.Name == name then
        return _mod
    else
        for modName, Mod in Shared.skpairs(ModData) do
            if modName == name or Mod.Name == name then
                return Mod
            end
        end
    end
end

----------------------------------------------------------------
------------------------------Проверка наличия Мода в базе модов
----------------------------------------------------------------
function ifModExists(name, _mod)
    if type(_mod) ~= table then
        _mod = ModData[name]
    elseif _mod.Name == name then
        return true
    end
    
    if _mod ~= nil and _mod.Name == name then
        return true
    else
        for modName, Mod in Shared.skpairs(ModData) do
            if modName == name or Mod.Name == name then
                return true
            end
        end
    end
    return false
end

------------------------------------------------------------------------
---Сканирует переданные Шаблоном значения из допустимых транслитератором
----------Возвращает две таблицы: ключи для ModData и введённые значения
------------------------------------------------------------------------
function p.importFromTemplate(frame)
    local varImported = {}
    local varIndex = {}
    local i = 0
    for ru, en in pairs(tl) do
        imported = frame.args[ru] or nil
        if imported ~=nil and imported~='' then
            i=i+1
            varIndex[i]=en  --string.Upper не работает для кирилицы. Использовать mw.ustring.upper--
            if mw.ustring.upper(imported) == 'ДА' or mw.ustring.upper(imported) == 'YES' or mw.ustring.upper(imported) == 'TRUE' 
                then varImported[i]=true
            elseif mw.ustring.upper(imported) == 'НЕТ' or mw.ustring.upper(imported) == 'NO' or mw.ustring.upper(imported) == 'FALSE'
                then varImported[i]=false
            else varImported[i]=imported
            end
        end
    end
    return varIndex,varImported
end

----------------------------------------------------------------------------
-------Выводит таблицу, содержащую modName для ModData всех подходящих модов.
-------Исключает .Exclude моды, когда не запрошено иначе.
-------По-умолчанию импортирует значения из frame через p.importFromTemplate.
-------Для ручного импорта, указать (frame, true ) после чего две таблицы
-------содержащие ключи для ModData в 1м и искомые значения во 2м в соответствующих порядках
-----------------------------------------------------------------------------
function p.getFilteredTable (frame, override, index, augments)
    local varIndex, varImported
    local carted={}
    
    if override == true then
        varIndex = index 
        varImported = augments
    else varIndex, varImported = p.importFromTemplate(frame) end
    
    local varCount = table.maxn( varIndex )
    local hitsRequred = varCount
    local hitsScored
    
    for modName, Mod in Shared.skpairs(ModData) do
        hitsScored = 0
        for i=1, varCount do
        if varIndex[i] then 
            if varIndex[i] == 'Type' then
                if varImported[i] == Mod.Type or varImported[i] == Mod.Subtype then
                    hitsScored=hitsScored+1
                end
            elseif varIndex[i] == 'Exclude' then
                if varImported[i] and toNil(Mod.Exclude)    
                    then hitsScored = hitsScored+2       -- мод исключен и ищем исключенные
                elseif not varImported[i] and not toNil(Mod.Exclude)
                    then hitsScored = hitsScored+1      -- мод не_исключен и ищем не_исключенные
                else break
                end
            elseif varImported[i] == toNil(Mod[varIndex[i]]) then
                hitsScored = hitsScored + 1
            end
        else 
            break -- прерывание если хотя бы один varImported НЕ_совпадает с не-нулевым varIndex
        end
    end
        if toNil(Mod.Exclude) then hitsScored = hitsScored - 1 end
        if hitsScored == hitsRequred then table.insert( carted, modName )
        end
    end
    return carted
end

----------------------------------------------------------------
------------Выведение картинок модов с определенными параметрами
----------------------------------------------------------------
function p.buildModGallery(frame)
    imported = p.getFilteredTable(frame)
    limit=table.maxn(imported)
    local Gallery=''
    for i=1, limit do
        if ModData[imported[i]].Link ~= nil then
            link_ = ModData[imported[i]].Link
        elseif ModData[imported[i]].Name ~= nil and ModData[imported[i]].Name ~= '' then
            link_ = ModData[imported[i]].Name
        else link_ = imported[i]
        end
        if ModData[imported[i]].Image ~= nil then
            image_ = ModData[imported[i]].Image
        elseif ModData[imported[i]].Name ~= nil and ModData[imported[i]].Name ~= '' then
            image_ = ModData[imported[i]].Name..'_вики.png'
        else image_ = imported[i]..'_вики.png'
        end
        Gallery = Gallery.. '[[Файл:' ..image_.. '|x180px|link='..link_..']]'
    end
return 'Модов с указанными параментрами на текущий момент - ' ..limit..':<br/>' ..Gallery

end


function toNil(thing)
    if thing==nil or thing=='' then return nil else return thing end
end


function p.tooltip(Mod)
    local Name = Mod.args ~= nil and Mod.args[1]
    local newName = Mod.args ~= nil and Mod.args[2]
    local Mod = nil
   
    if newName == '' then newName = nil end
    
    if Name == nil then
        return '<span style="color:red;">{{[[Шаблон:МодТ|МодТ]]}} Введите название Мода.</span>[[Категория:'..'Ошибка Tooltip Моды]]'
    else
        Mod = getMod(Name)
    end
    
    if Mod == nil then
        return '<span style="color:red;">{{[[Шаблон:МодТ|МодТ]]}} "'..Name..'" не найден</span>[[Категория:'..'Ошибка Tooltip Моды]]'
    else
        local Link = Mod.Link ~= nil and Mod.Link or nil
        
        local linkText = ''
        if newName ~= nil then
            linkText = newName
        else
            linkText = Name
        end

        --mw.log(Link)
        local tMod = '{{Подсказка|'..Name..'|#Preview|[['..Name..'|<span title="">'..linkText..'</span>]]}}'
        
--[[
        table.insert(tMod,'<span class="mod-tooltip" data-param="'..Name..'">')
        table.insert(tMod,'[_[File:Mod_TT_20px.png|link='..Name..']_]'..'&thinsp;[_[')
        table.insert(tMod,linkText..']_]</span>')
]]--
        
        return tMod
    end
end
    
----------------------------------------------------------------
--Всплывающее окно при наведении на надпись Мода в тексте статьи 
----------------------------(используется в Шаблон:Мод инфобокс)
----------------------------------------------------------------
function p.tooltipText(Mod) --добить по всплывающей подсказке под нашу вики
    local Name = Mod.args ~= nil and Mod.args[1]
    local newName = Mod.args ~= nil and Mod.args[2]
    local Mod = nil
    if newName == '' then newName = nil end
    
    if Name == nil then
        return '<span style="color:red;">{{[[Шаблон:Моды|Mod]]}} Введите название Мода.</span>[[Категория:'..'Ошибка Tooltip Моды]]'
    else
        Mod = getMod(Name)
    end
    
    if Mod == nil then
        return '<span style="color:red;">{{[[Шаблон:Моды|Mod]]}} "'..Name..'" не найден</span>[[Категория:'..'Ошибка Tooltip Моды]]'
    else
        local Link = Mod.Link ~= nil and Mod.Link or nil
        
        local linkText = ''
        if Link ~= nil and newName ~= nil then
            linkText = Link..'|'..newName
        elseif newName ~= nil then
            linkText = Name..'|'..newName
        elseif Link ~= nil then
            linkText = Link..'|'..Name
        else
            linkText = Name
        end
        
        --mw.log(Link)
        local tMod ={}
        table.insert(tMod,'<span class="mod-tooltip" data-param="'..Name..'">')
        table.insert(tMod,'[[File:Mod_TT_20px.png|link='..Name..']]'..'&thinsp;[[')
        table.insert(tMod,linkText..']]</span>')
        
        return table.concat(tMod)
    end
end


----------------------------------------------------------------
--------------------------------------------Построение инфобокса 
----------------------------(используется в Шаблон:Мод инфобокс)
----------------------------------------------------------------
function p.modInfobox(ModName)
    name = '{{{Название|{{PAGENAME}}}}}'
    Mod = getMod(ModName)
    local Infobox = ''
    
    Infobox = Infobox..'<onlyinclude>'
    Infobox = Infobox..'\n<infobox theme="mod">'
    Infobox = Infobox..'\n<title source = "Название"><default>'..name..'</default></title>'
    Infobox = Infobox..'\n<data source = "Изображение">'
    Infobox = Infobox..'\n<default>{{{Изображение|'..modImage(name)..'}}}<br /><div style="text-align:center; font-weight:bold; font-size:15px;">{{{Преобразование|'..modTransmutable(name)..'}}}</div></default>'
    Infobox = Infobox..'\n</data>'
    Infobox = Infobox..'\n<data source="Тип"><label>Тип</label><default><includeonly>{{{Тип|'..getValue(name,"Тип")..'}}}</includeonly></default></data>'
    Infobox = Infobox..'\n<data source="Полярность"><label>Полярность</label><default><includeonly>{{{Полярность|'..getValue(name, 'ПолярностьИконка')..'}}}</includeonly></default></data>'
    Infobox = Infobox..'\n<data source="Налог"><label>Налог торговли</label><default><includeonly>{{{Налог|'..modTax(name)..'}}}</includeonly></default></data>'
    Infobox = Infobox..'\n<header>Получение<br/></header>'
    Infobox = Infobox..'\n<data source="Получение"><default><includeonly><div>{{{Получение|'..modSyndicate(name)..'}}}</div></includeonly></default></data>'
    Infobox = Infobox..'\n<header> </header>'            --[[ отрисовка пустого раздела для                                                                 корректной работы - "костыль" ]]--
    Infobox = Infobox..'\n</infobox>'
    Infobox = Infobox..'\n{{#if:{{{name|}}}|[[en:{{{name|}}}]]}}'
    Infobox = Infobox..'\n</onlyinclude>'
end

----------------------------------------------------------------
----------------------------Выводит все текущие подтипы использованные в Данных
----------------------------(Только для отладки)
----------------------------------------------------------------
function p.getEmSubtypes()
    local index= {}
    local a
    local limit
    for modName, Mod in Shared.skpairs(ModData) do
        a=false
        limit=table.maxn( index )
        for i=0, limit do
         if Mod.Subtype==index[i] then a=true break end
         end
        if a==false then table.insert( index, Mod.Subtype )end
        
    end
    --return index
    return table.concat(index, ' | ')
end


-- accepts three parameters: 
-- a string that represents mod rarity: 'Common', 'Uncommon', 'Rare', 'Legendary', 'Amalgam', 'Peculiar', 'Requiem', 'All', or ''
-- a string that represents polarity: 'Madurai', 'Naramon', 'Vazarin', 'Zenurik', 'Unairu', 'Penjaga', or nil
-- a string that represents transmutability: 'true', 'false', '', or nil (counting both transmutable and non-transmutable mods)
function p.getModCount(Mod)
    local total = 0
    local rarity = Mod.args[1]
    local polarity = Mod.args[2]
    local transmutable = Mod.args[3]
    
    if (rarity == '' or rarity == nil) then
       rarity = 'All' 
    end
    
    if (polarity == '' or polarity == nil) then
        polarity = 'All'
    end
    
    if transmutable == 'true' then
        transmutable = true
    elseif transmutable == 'false' then
        transmutable = false
    else
        transmutable = 'All'
    end
    
    -- treating mods without Transmutable attribute as transmutable
    for name, Mod in Shared.skpairs(ModData['Моды']) do
        if ((Mod['Rarity'] == rarity or rarity == 'All') and 
            (Mod['Polarity'] == polarity or polarity == 'All') and
            (Mod['Transmutable'] == nil or Mod['Transmutable'] == transmutable or transmutable == 'All') and
            not Shared.contains(ModData['IgnoreInCount'], name)) then
            
            total = total + 1
        end
    end
    
    return total
end

return p
Advertisement