League of Legends Wiki
League of Legends Wiki
Нет описания правки
(championTFT - исправление ошибки показа иконки)
(не показано 18 промежуточных версий этого же участника)
Строка 10: Строка 10:
 
 
 
--[[
 
--[[
{{#invoke: ImageLink | ability
 
| champion =
 
| ability = -- can be empty
 
...
 
}}
 
 
{{#invoke: ImageLink | buff
 
| buff =
 
| variant = -- can be empty
 
...
 
}}
 
 
{{#invoke: ImageLink | champion
 
| champion =
 
| skin = -- can be empty
 
| circle = -- can be empty
 
| variant = -- can be empty
 
...
 
}}
 
 
{{#invoke: ImageLink | item
 
| item =
 
| enchantment = -- can be empty
 
| variant = -- can be empty
 
...
 
}}
 
 
{{#invoke: ImageLink | loading
 
| champion =
 
| skin =
 
| variant = -- can be empty
 
...
 
}}
 
 
{{#invoke: ImageLink | rune
 
| rune =
 
| variant = -- can be empty
 
...
 
}}
 
 
{{#invoke: ImageLink | spell
 
| spell =
 
| variant = -- can be empty
 
...
 
}}
 
 
{{#invoke: ImageLink | ward
 
| ward =
 
| variant = -- can be empty
 
...
 
}}
 
 
 
{{#invoke: ImageLink | basic
 
{{#invoke: ImageLink | basic
 
| link =
 
| link =
Строка 110: Строка 58:
 
function ImageLink.buff(frame)
 
function ImageLink.buff(frame)
 
local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
+
 
args['engname'] = args['engname'] or args['buff']
 
args['link'] = args['link'] or args['buff'] or ''
 
args['link'] = args['link'] or args['buff'] or ''
 
args['text'] = args['text'] or args['buff'] or ''
 
args['text'] = args['text'] or args['buff'] or ''
args['image'] = args['image'] or FN.buff{args['buff'], args['variant']}
+
args['image'] = args['image'] or FN.buff{args['engname'], args['variant']}
 
args['editlink'] = args['editlink'] or formatnil('Template:Buff data %s', args['buff']) or ''
 
args['editlink'] = args['editlink'] or formatnil('Template:Buff data %s', args['buff']) or ''
 
 
Строка 130: Строка 79:
 
args['text'] = args['text'] or args['champion'] or ''
 
args['text'] = args['text'] or args['champion'] or ''
 
if args['circle'] == 'true' then
 
if args['circle'] == 'true' then
args['image'] = args['image'] or FN.championcircle{args['champion'], args['skin'], args['variant']}
+
args['image'] = args['image'] or FN.championcircle(args)
 
args['border'] = args['border'] or 'false'
 
args['border'] = args['border'] or 'false'
 
else
 
else
args['image'] = args['image'] or FN.championsquare{args['champion'], args['skin'], args['variant']}
+
args['image'] = args['image'] or FN.championsquare(args)
 
end
 
end
 
 
args['editlink'] = args['editlink'] or formatnil('Template:Data %s', args['champion']) or ''
+
args['editlink'] = args['editlink'] or "Модуль:ChampionData/data"
   
 
args['selflink'] = args['selflink'] or mw.title.getCurrentTitle().rootText
 
args['selflink'] = args['selflink'] or mw.title.getCurrentTitle().rootText
Строка 142: Строка 91:
 
local link, img = ImageLink._createLink(args)
 
local link, img = ImageLink._createLink(args)
 
link:addClass('champion-icon')
 
link:addClass('champion-icon')
link:attr('data-skin', lib.ternary(args['skin'] == '', rl10n.adjustOriginal(args['champion']), args['skin'] or rl10n.adjustOriginal(args['champion'])))
+
link:attr('data-skin', args["skin"] or "Original")
 
if args['champion'] then link:attr('data-champion', args['champion']) end
 
if args['champion'] then link:attr('data-champion', args['champion']) end
 
if args['variant'] then link:attr('data-variant', args['variant']) end
 
if args['variant'] then link:attr('data-variant', args['variant']) end
 
if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
 
if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
 
return link
 
end
  +
 
function ImageLink.championTFT(frame)
 
local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
 
local TFTData = mw.loadData('Модуль:TFTUnitData/data')
 
local TFTFunctions = require('Модуль:TFTUnitData')
 
local currentSet = tonumber(mw.loadData('Модуль:Maintenance data/data')['TFTSet'])
 
 
local championData = TFTData[args['champion']]
 
 
args['link'] = args['link'] or args['champion'] .. '/TFT' or ''
 
args['text'] = args['text'] or args['champion'] or ''
 
args['set'] = tonumber(args['set']) or currentSet
 
if(championData[args['set']] == nil) then
 
args['set'] = TFTFunctions.getLastSet{args['champion']}
 
end
 
 
args['image'] = args['image'] or FN.championsquare{['champion'] = args["champion"], ["engskin"] = championData[args['set']]['skin']}
 
 
local link, img = ImageLink._createLink(args)
 
link:addClass('tft-icon')
 
link:attr({
 
['data-param'] = args['champion'],
 
['data-type'] = 'champion',
 
['data-set'] = args['set']
 
})
  +
 
if args['width'] and img ~= nil then
 
img:addClass('icon-' .. args['width'])
 
end
 
return link
 
return link
 
end
 
end
Строка 155: Строка 136:
 
args['link'] = args['link'] or args['enchantment'] or ''
 
args['link'] = args['link'] or args['enchantment'] or ''
 
args['text'] = formatnil('%s (%s)', args['item'], args['enchantment']) or args['text'] or ''
 
args['text'] = formatnil('%s (%s)', args['item'], args['enchantment']) or args['text'] or ''
args['image'] = args['image'] or FN.item{['item'] = args['item'], ['enchantment'] = args['enchantment'], ['variant'] = args['variant']}
+
args['image'] = args['image'] or FN.item{['item'] = args['item'], ['enchantment'] = args['enchantment'], ['variant'] = args['variant'], ['engname'] = args['engname'] or args['item']}
 
else
  +
args['link'] = args['link'] or args['item'] or ''
 
args['text'] = args['text'] or args['item'] or ''
  +
args['image'] = args['image'] or FN.item{args['item'], args['variant'], ['engname'] = args['engname'] or args['item']}
 
end
 
  +
args['editlink'] = args['editlink'] or "Модуль:ItemData/data"
 
  +
local link, img = ImageLink._createLink(args)
  +
link:addClass('item-lua-icon')
 
  +
if args['item'] then link:attr('data-param', args['item']) end
  +
if args['enchantment'] then link:attr('data-enchantment', enchantment):addClass('enchantment-icon') end
  +
if args['variant'] then link:attr('data-variant', args['variant']) end
  +
if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
 
  +
return link
  +
end
 
  +
function ImageLink.itemOld(frame)
  +
local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
 
if args['enchantment'] then
  +
args['link'] = args['link'] or args['enchantment'] or ''
  +
args['text'] = formatnil('%s (%s)', args['item'], args['enchantment']) or args['text'] or ''
  +
args['image'] = args['image'] or FN.item{['item'] = args['item'], ['enchantment'] = args['enchantment'], ['variant'] = args['variant'], ['engname'] = args['engname'] or args['item']}
 
else
 
else
 
args['link'] = args['link'] or args['item'] or ''
 
args['link'] = args['link'] or args['item'] or ''
 
args['text'] = args['text'] or args['item'] or ''
 
args['text'] = args['text'] or args['item'] or ''
args['image'] = args['image'] or FN.item{args['item'], args['variant']}
+
args['image'] = args['image'] or FN.item{args['item'], args['variant'], ['engname'] = args['engname'] or args['item']}
 
end
 
end
 
 
args['editlink'] = args['editlink'] or formatnil('Template:Item data %s', args['item']) or ''
+
args['editlink'] = args['editlink'] or "Модуль:ItemData/data"
 
 
 
local link, img = ImageLink._createLink(args)
 
local link, img = ImageLink._createLink(args)
 
link:addClass('item-icon')
 
link:addClass('item-icon')
 
 
if args['item'] then link:attr('data-param', lib.validateItemName(args['item'])) end
+
if args['item'] then link:attr('data-param', args['item']) end
 
if args['enchantment'] then link:attr('data-enchantment', enchantment):addClass('enchantment-icon') end
 
if args['enchantment'] then link:attr('data-enchantment', enchantment):addClass('enchantment-icon') end
 
if args['variant'] then link:attr('data-variant', args['variant']) end
 
if args['variant'] then link:attr('data-variant', args['variant']) end
Строка 196: Строка 203:
 
if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
 
if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
 
 
return link
 
end
 
 
function ImageLink.championTFT(frame)
 
local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
 
local TFTData = mw.loadData('Модуль:TFTUnitData/data')
 
local TFTFunctions = require('Модуль:TFTUnitData')
 
local currentSet = tonumber(mw.loadData('Модуль:Maintenance data/data')['TFTSet'])
 
 
local championData = TFTData[args['champion']]
 
 
args['link'] = args['link'] or args['champion'] .. '/TFT' or ''
 
args['text'] = args['text'] or args['champion'] or ''
 
args['set'] = tonumber(args['set']) or currentSet
 
if(championData[args['set']] == nil) then
 
args['set'] = TFTFunctions.getLastSet{args['champion']}
 
end
 
 
args['image'] = args['image'] or FN.championsquare({args['champion'], championData[args['set']]['skin']})
 
 
local link, img = ImageLink._createLink(args)
 
link:addClass('tft-icon')
 
link:attr({
 
['data-param'] = args['champion'],
 
['data-type'] = 'champion',
 
['data-set'] = args['set']
 
})
 
 
if args['width'] and img ~= nil then
 
img:addClass('icon-' .. args['width'])
 
end
 
 
return link
 
return link
 
end
 
end
Строка 273: Строка 248:
 
function ImageLink.skin(frame)
 
function ImageLink.skin(frame)
 
local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
 
  +
-- Таблица образов нужна всегда для формирования названия образа
local skinData = mw.loadData('Module:SkinData/data')
+
local skins = mw.loadData("Модуль:SkinData/data")
local skinname = args['skin'] or rl10n.adjustOriginal(args['champion'])
 
  +
 
if skinData[args['champion']].skins[skinname] == nil then
+
local champion = args["champion"]
  +
local engname = args["engname"]
return userError("Образ ''" .. skinname .. "'' для чемпиона " .. args['champion'] .. " не найден в Module:SkinData/data" , "LuaError")
 
  +
local skin = args["skin"]
  +
local engskin = args["engskin"]
  +
  +
if(skins[champion] == nil) then
  +
return userError(
  +
mw.ustring.format(
  +
"Чемпион %s не найден в Модуль:SkinData/data (message from Модуль:ImageLink)",
  +
champion),
  +
"LuaError")
 
end
 
end
  +
 
  +
-- Если образ не указан, то достать Классический (с учетом рода)
local formatname = skinData[args['champion']].skins[skinname].formatname
 
  +
if(skin == nil) then
 
  +
if(skins[champion]["skins"]["Классический"]) then skin = "Классический" end
args['link'] = args['link'] or args['champion'] or ''
 
  +
if(skins[champion]["skins"]["Классическая"]) then skin = "Классическая" end
args['text'] = args['text'] or lib.ternary(formatname, formatname, skinname .. " " .. args['champion']) or ''
 
  +
if(engskin == nil) then engskin = "Original" end
  +
args["skin"] = skin
  +
elseif(skins[champion]["skins"][skin] == nil) then
  +
return userError(
  +
mw.ustring.format(
  +
"Образ %s для чемпиона %s не найден в Модуль:SkinData/data (message from Модуль:ImageLink)",
  +
skin,
  +
champion),
  +
"LuaError")
  +
end
  +
  +
local skinInstance = skins[champion]["skins"][skin]
  +
local formatname = skinInstance.formatname or mw.ustring.format("%s %s", skin, champion)
 
  +
args['link'] = args['link'] or champion or ''
  +
args['text'] = args['text'] or formatname
  +
 
if args['circle'] == 'true' then
 
if args['circle'] == 'true' then
args['image'] = args['image'] or FN.championcircle{args['champion'], args['skin'], args['variant']}
+
args['image'] = args['image'] or FN.championcircle(args)
 
args['border'] = args['border'] or 'false'
 
args['border'] = args['border'] or 'false'
 
else
 
else
args['image'] = args['image'] or FN.champion{args['champion'], args['variant']}
+
args['image'] = args['image'] or FN.championsquare(args)
 
end
 
end
 
 
args['editlink'] = args['editlink'] or 'Модуль:ChampionData/data'
+
args['editlink'] = args['editlink'] or 'Модуль:SkinData/data'
 
 
 
args['selflink'] = args['selflink'] or mw.title.getCurrentTitle().rootText
 
args['selflink'] = args['selflink'] or mw.title.getCurrentTitle().rootText
Строка 298: Строка 299:
 
local link, img = ImageLink._createLink(args)
 
local link, img = ImageLink._createLink(args)
 
link:addClass('skin-icon')
 
link:addClass('skin-icon')
link:attr('data-skin', skinname)
+
link:attr('data-skin', args["skin"])
 
if args['champion'] then link:attr('data-champion', args['champion']) end
 
if args['champion'] then link:attr('data-champion', args['champion']) end
 
if args['variant'] then link:attr('data-variant', args['variant']) end
 
if args['variant'] then link:attr('data-variant', args['variant']) end
Строка 375: Строка 376:
 
local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
 
local traitData = mw.loadData("Модуль:TFTTraitData/data")
+
local traitData = require("Модуль:TFTTraitData")
  +
local set = tonumber(args['set']) or traitData.getLastSet{args['trait']}
 
 
 
args['link'] = args['link'] or args['trait'] .. ' (Teamfight Tactics)' or ''
 
args['link'] = args['link'] or args['trait'] .. ' (Teamfight Tactics)' or ''
 
args['text'] = args['text'] or args['trait'] or ''
 
args['text'] = args['text'] or args['trait'] or ''
 
if(args['image'] == nil) then
 
if(args['image'] == nil) then
if(traitData[args['trait']]) then
+
args['image'] = traitData.get{args['trait'], set, "icon"}
mw.log(traitData[args['trait']])
 
args['image'] = (traitData[args['trait']].engname or args['trait']) .. " TFT icon.svg"
 
end
 
 
end
 
end
 
--args['image'] = args['image'] or args['trait'] .. ' TFT icon.svg'
 
--args['image'] = args['image'] or args['trait'] .. ' TFT icon.svg'
Строка 391: Строка 390:
 
 
 
local link, img = ImageLink._createLink(args)
 
local link, img = ImageLink._createLink(args)
  +
if args['set'] then
 
link:addClass('tft-icon')
+
link:addClass('tft-icon')
link:attr('data-param', args['trait'])
+
link:attr('data-param', args['trait'])
link:attr('data-type', 'trait')
+
link:attr('data-type', 'trait')
link:attr('data-set', args['set'])
+
link:attr('data-set', set)
end
 
 
 
 
return link
 
return link

Версия от 14:35, 11 июня 2021

Данный модуль используется для генерации стандартных блоков текста, состоящих из иконки объекта и текста-ссылки к нему. Объектами являются различные элементы игр League of Legends и Teamfight Tactics, а также подписей к ним.

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

Большинство функций действуют по одному и тому же принципу. Сначала формируется единый объект, в котором обязательно указываются имя объекта, название файла иконки (вызывается из Модуль:Filename), ссылка на страницу и выводимый текст ссылки. Также присутствует несколько побочных аргументов, которые изменяют внешний вид иконки и подписи к ней. Помимо этого в большинстве случаев получившийся текст оборачивают в span, которому присваивают информацию о вызываемом объекте (в виде HTML атрибутов), что позволяет показывать всплывающую подсказку об этом объекте при наведении курсора мыши.

Ниже в таблице перечислены основные публичные функции, вызывающие иконки игровых объектов.

Краткое название функции Соответствующий игровой объект
ability Умение чемпиона League of Legends
buff Усиление из League of Legends
champion Чемпион League of Legends
championTFT Чемпион Teamfight Tactics
item Предмет League of Legends
itemOld Предмет League of Legends (устаревший вариант)
itemTFT Предмет Teamfight Tactics
loading Иллюстрация образа из экране загрузки
rune Руна League of Legends
skin Образ чемпиона League of Legends
spell Заклинание призывателя League of Legends
ward Образ тотема League of Legends
faction Фракция Рунтерры
universe Иконка альтернативной вселенной
TFTTrait Группа (фракция/класс/стихия) TFT
basic Generic-вариант функции для вызова произвольной информации

Все вышеперечисленные функции вызываются через шаблоны-обертки категории Шаблоны иконок.

From Модуль:ImageLink/doc

-- <pre>
local ImageLink = {}
 
-- Dependencies
local HF        = require("Dev:HF")
local FN        = require("Module:Filename")
local lib       = require('Module:Feature')
local rl10n     = require("Module:RusLocalization")
local userError = require('Dev:User error')
 
--[[
{{#invoke: ImageLink | basic
| link        = 
| text        = 
| alttext     = 
| image       = 
| image2      = 
| image3      = 
| size        = 
| width       = 
| height      = 
| border      = 
| separator   = 
| display     = 
| class       = 
| style       = 
| iconclass   = 
| iconstyle   = 
| label       = 
| labellink   = 
| labelclass  = 
| labelstyle  = 
| possessive  =
| edit        =
| editlink    =
}}
]]--
 
function ImageLink.ability(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
    args['link'] = args['link'] or formatnil('%s#%s', args['champion'], args['ability']) or args['champion'] or ''
    args['text'] = args['text'] or args['ability'] or ''
    args['image'] = args['image'] or FN.ability{args['ability'], args['variant']}
    args['editlink'] = args['editlink'] or formatnil('Template:Data %s/%s', args['champion'], args['ability']) or ''
 
    local link, img = ImageLink._createLink(args)
    if args['champion'] and args['ability'] then
        link:addClass('ability-icon')
        if args['champion'] then link:attr('data-champion', args['champion']) end
        if args['ability'] then link:attr('data-ability', args['ability']) end
        if args['variant'] then link:attr('data-variant', args['variant']) end
    end
    if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
    return link
end
 
function ImageLink.buff(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
	
	args['engname'] = args['engname'] or args['buff']
    args['link'] = args['link'] or args['buff'] or ''
    args['text'] = args['text'] or args['buff'] or ''
    args['image'] = args['image'] or FN.buff{args['engname'], args['variant']}
    args['editlink'] = args['editlink'] or formatnil('Template:Buff data %s', args['buff']) or ''
 
    local link, img  = ImageLink._createLink(args)
    link:addClass('buff-icon')
    if args['buff'] then link:attr('data-param', args['buff']) end
    if args['variant'] then link:attr('data-variant', args['variant']) end
    if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
    return link
end
 
function ImageLink.champion(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    
    args['link'] = args['link'] or args['champion'] or ''
    args['text'] = args['text'] or args['champion'] or ''
    if args['circle'] == 'true' then
        args['image'] = args['image'] or FN.championcircle(args)
        args['border'] = args['border'] or 'false'
    else
        args['image'] = args['image'] or FN.championsquare(args)
    end
    
    args['editlink'] = args['editlink'] or "Модуль:ChampionData/data"

    args['selflink'] = args['selflink'] or mw.title.getCurrentTitle().rootText
    
    local link, img = ImageLink._createLink(args)
    link:addClass('champion-icon')
    link:attr('data-skin', args["skin"] or "Original")
    if args['champion'] then link:attr('data-champion', args['champion']) end
    if args['variant'] then link:attr('data-variant', args['variant']) end
    if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
    return link
end

function ImageLink.championTFT(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
        
    local TFTData = mw.loadData('Модуль:TFTUnitData/data')
    local TFTFunctions = require('Модуль:TFTUnitData')
    local currentSet = tonumber(mw.loadData('Модуль:Maintenance data/data')['TFTSet'])
    
    local championData = TFTData[args['champion']]
    
    args['link'] = args['link'] or args['champion'] .. '/TFT'  or ''
    args['text'] = args['text'] or args['champion'] or ''
    args['set']  = tonumber(args['set']) or currentSet
    if(championData[args['set']] == nil) then
        args['set'] = TFTFunctions.getLastSet{args['champion']}
    end
        
    args['image'] = args['image'] or FN.championsquare{['champion'] = args["champion"], ["engskin"] = championData[args['set']]['skin']}
    
    local link, img = ImageLink._createLink(args)
    link:addClass('tft-icon')
    link:attr({
        ['data-param'] = args['champion'],
        ['data-type'] = 'champion',
        ['data-set'] = args['set']
    })

    if args['width'] and img ~= nil then
        img:addClass('icon-' .. args['width']) 
    end
    return link
end
 
function ImageLink.item(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
    if args['enchantment'] then
        args['link'] = args['link'] or args['enchantment'] or ''
        args['text'] = formatnil('%s (%s)', args['item'], args['enchantment']) or args['text'] or ''
        args['image'] = args['image'] or FN.item{['item'] = args['item'], ['enchantment'] = args['enchantment'], ['variant'] = args['variant'], ['engname'] = args['engname'] or args['item']}
    else
        args['link'] = args['link'] or args['item'] or ''
        args['text'] = args['text'] or args['item'] or ''
        args['image'] = args['image'] or FN.item{args['item'], args['variant'], ['engname'] = args['engname'] or args['item']}
    end
 
    args['editlink'] = args['editlink'] or "Модуль:ItemData/data"
 
    local link, img = ImageLink._createLink(args)
    link:addClass('item-lua-icon')
    
    if args['item'] then link:attr('data-param', args['item']) end
    if args['enchantment'] then link:attr('data-enchantment', enchantment):addClass('enchantment-icon') end
    if args['variant'] then link:attr('data-variant', args['variant']) end
    if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
 
    return link
end
 
function ImageLink.itemOld(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
    if args['enchantment'] then
        args['link'] = args['link'] or args['enchantment'] or ''
        args['text'] = formatnil('%s (%s)', args['item'], args['enchantment']) or args['text'] or ''
        args['image'] = args['image'] or FN.item{['item'] = args['item'], ['enchantment'] = args['enchantment'], ['variant'] = args['variant'], ['engname'] = args['engname'] or args['item']}
    else
        args['link'] = args['link'] or args['item'] or ''
        args['text'] = args['text'] or args['item'] or ''
        args['image'] = args['image'] or FN.item{args['item'], args['variant'], ['engname'] = args['engname'] or args['item']}
    end
 
    args['editlink'] = args['editlink'] or "Модуль:ItemData/data"
 
    local link, img = ImageLink._createLink(args)
    link:addClass('item-icon')
    
    if args['item'] then link:attr('data-param', args['item']) end
    if args['enchantment'] then link:attr('data-enchantment', enchantment):addClass('enchantment-icon') end
    if args['variant'] then link:attr('data-variant', args['variant']) end
    if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
 
    return link
end

function ImageLink.itemTFT(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
    
    args['link'] = args['link'] or args['item'] .. ' (Teamfight Tactics)' or ''
    args['text'] = args['text'] or args['item'] or ''
    args['image'] = args['image'] or FN.itemTFT{args['item'], ["engname"] = args["engname"] or args["item"]}
    
 
    args['editlink'] = args['editlink'] or "Модуль:TFTItemData/data" or ''
 
    local link, img = ImageLink._createLink(args)
    link:addClass('tft-icon')
    link:attr({
        ['data-param'] = args['item'],
        ['data-type'] = 'item',
        ['data-set'] = args['set']
    })
    if args['variant'] then link:attr('data-variant', args['variant']) end
    if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
 
    return link
end
 
function ImageLink.loading(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    local sk = '';    
    if(args['skin'] == '' or 'Классический') then
        sk = rl10n.adjustOriginal(args['champion'])
    end    
 
    args['link'] = args['link'] or args['champion'] or ''
    args['text'] = args['text'] or args['champion'] or ''
    args['image'] = args['image'] or FN.loading{args['champion'], sk, args['variant']}
    args['border'] = args['border'] or 'false'
    args['size'] = args['size'] or '110px'
 
    args['selflink'] = args['selflink'] or mw.title.getCurrentTitle().rootText
 
    local link, img = ImageLink._createLink(args)
    link:addClass('skin-icon')
    link:attr('data-skin', sk)
    if args['champion'] then link:attr('data-champion', args['champion']) end
    if args['variant'] then link:attr('data-variant', args['variant']) end
    if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
    return link
end
 
function ImageLink.rune(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
    args['link'] = args['link'] or args['rune'] .. ' (Руна)'
    args['text'] = args['text'] or args['rune'] or ''
    args['image'] = args['image'] or FN.rune{args['rune'], args['variant']}
    args['editlink'] = args['editlink'] or formatnil('Template:Rune data %s', args['rune']) or ''
 
    local link, img  = ImageLink._createLink(args)
    link:addClass('rune-icon')
    if args['rune'] then link:attr('data-param', args['rune']) end
    if args['variant'] then link:attr('data-variant', args['variant']) end
    if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
    return link
end
 
function ImageLink.skin(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    
    -- Таблица образов нужна всегда для формирования названия образа
    local skins = mw.loadData("Модуль:SkinData/data")
    
    local champion = args["champion"]
    local engname = args["engname"]
    local skin = args["skin"]
    local engskin = args["engskin"]
    
    if(skins[champion] == nil) then
    	return userError(
    		mw.ustring.format(
    			"Чемпион %s не найден в Модуль:SkinData/data (message from Модуль:ImageLink)",
    			champion),
    		"LuaError")
    end
    
    -- Если образ не указан, то достать Классический (с учетом рода)
    if(skin == nil) then
    	if(skins[champion]["skins"]["Классический"]) then skin = "Классический" end
    	if(skins[champion]["skins"]["Классическая"]) then skin = "Классическая" end
    	if(engskin == nil) then engskin = "Original" end
    	args["skin"] = skin
    elseif(skins[champion]["skins"][skin] == nil) then
    	return userError(
    		mw.ustring.format(
    			"Образ %s для чемпиона %s не найден в Модуль:SkinData/data (message from Модуль:ImageLink)",
    			skin,
    			champion),
    		"LuaError")
    end
    
    local skinInstance = skins[champion]["skins"][skin]
    local formatname = skinInstance.formatname or mw.ustring.format("%s %s", skin, champion)
	
    args['link'] = args['link'] or champion or ''
    args['text'] = args['text'] or formatname
    
    if args['circle'] == 'true' then
        args['image'] = args['image'] or FN.championcircle(args)
        args['border'] = args['border'] or 'false'
    else
        args['image'] = args['image'] or FN.championsquare(args)
    end
 
    args['editlink'] = args['editlink'] or 'Модуль:SkinData/data'
 
    args['selflink'] = args['selflink'] or mw.title.getCurrentTitle().rootText
 
    local link, img = ImageLink._createLink(args)
    link:addClass('skin-icon')
    link:attr('data-skin', args["skin"])
    if args['champion'] then link:attr('data-champion', args['champion']) end
    if args['variant'] then link:attr('data-variant', args['variant']) end
    if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
    return link
end
 
function ImageLink.spell(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
    args['link'] = args['link'] or args['spell'] .. ' (Заклинание)'
    args['text'] = args['text'] or args['spell'] or ''
    args['image'] = args['image'] or FN.spell{args['spell'], args['variant']}
    args['editlink'] = args['editlink'] or formatnil('Template:Spell data/%s', args['spell']) or ''
 
    local link, img = ImageLink._createLink(args)
    link:addClass('spell-icon')
    if args['spell'] then link:attr('data-param', args['spell']) end
    if args['variant'] then link:attr('data-variant', args['variant']) end
    if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
    return link
end
 
function ImageLink.ward(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
    args['link'] = args['link'] or 'Ward skins'
    args['text'] = args['text'] or args['ward'] .. ' Ward' or ''
    args['image'] = args['image'] or FN.ward{args['ward']}
 
    args['size'] = args['size'] or 64
    args['border'] = args['border'] or 'false'
 
    local link, img = ImageLink._createLink(args)
    link:addClass('ward-icon')
    if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
    return link
end

function ImageLink.faction(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    
    args['link'] = args['link'] or args['faction'] or 'Рунтерра'
    args['text'] = args['text'] or args['faction'] or ''
    args['image'] = args['image'] or FN.faction{args['faction']}
    
    
    args['size'] = args['size'] or 20
    args['border'] = args['border'] or 'false'
    local link, img = ImageLink._createLink(args)
    link:addClass('faction-icon')
    if args['faction'] then link:attr('data-param', args['faction']) end
    if args['variant'] then link:attr('data-variant', args['variant']) end
    if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
    return link
end

function ImageLink.universe(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    
    args['link'] = args['link'] or args['universe'] or 'Рунтерра'
    args['text'] = args['text'] or args['universe'] or ''
    args['image'] = args['image'] or FN.universe{args['universe']}
    
    
    args['size'] = args['size'] or 20
    args['border'] = args['border'] or 'false'
    local link, img = ImageLink._createLink(args)
    link:addClass('universe-icon')
    if args['universe'] then link:attr('data-param', args['universe']) end
    if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end
    return link
end

function ImageLink.TFTtrait(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
    	
    local traitData = require("Модуль:TFTTraitData")
    local set = tonumber(args['set']) or traitData.getLastSet{args['trait']}
 
    args['link'] = args['link'] or args['trait'] .. ' (Teamfight Tactics)' or ''
    args['text'] = args['text'] or args['trait'] or ''
    if(args['image'] == nil) then
		args['image'] = traitData.get{args['trait'], set, "icon"}
    end
    --args['image'] = args['image'] or args['trait'] .. ' TFT icon.svg'
 
    args['editlink'] = args['editlink'] or 'Модуль:TFTTraitData/data'
    args['selflink'] = args['selflink'] or mw.title.getCurrentTitle().rootText
 
    local link, img = ImageLink._createLink(args)
    
    link:addClass('tft-icon')
    link:attr('data-param', args['trait'])
    link:attr('data-type', 'trait')
    link:attr('data-set', set)
 
    return link
end
 
function ImageLink.basic(frame)
    local args; if frame.args == nil then args = lib.arguments(frame) else args = lib.arguments(frame.args) end
 
    local link, img, label = ImageLink._createLink(args)
    return link
end
 
function ImageLink._createLink(args)
    -- define args.display (default: inline)
    args['display'] = (({['inlineblock'] = 'inline-block'})[args['display']]) or args['display'] or 'inline'
 
    -- define args.image (default: '')
    args['image'] = args['image'] or ''
    if args['image'] == '*none*' then args['image'] = '' end
 
    -- define args.border (true or false; default: true)
    args['border'] = args['border'] or true
    if args['border'] == 'false' or args['border'] == '0' then args['border'] = false end
 
    -- define args.edit (true or false; default: false)
    args['edit'] = args['edit'] or false
    if args['edit'] == 'true' or args['edit'] == '1' then args['edit'] = true end
 
    -- define args.style (default: 'white-space:pre')
    args['style'] = args['style'] or 'white-space:pre'
    if args['style'] == '*none*' then args['style'] = nil end
 
    -- define args.labelstyle (default: 'white-space:normal')
    args['labelstyle'] = args['labelstyle'] or 'white-space:normal'
    if args['labelstyle'] == '*none*' then args['labelstyle'] = nil end
 
    -- define args.width, args.height (%%x%%px or %%x%% or %%px or %%; default: 20px)
    local width, height
    if(args['size']) then width, height = getSize(args['size']) end
    args['size'] = args['size'] or 20
    args['width'] = tonumber(mw.ustring.match(args['width'] or width or '', '%d*'))
    args['height'] = tonumber(mw.ustring.match(args['height'] or height or '', '%d*'))
    if(not args['height']) then args['width'] = args['width'] or args['size'] end
 
    -- define args.selflink (default: articlename)
    args['selflink'] = args['selflink'] or mw.title.getCurrentTitle().prefixedText
 
    -- define args.link (default: '')
    args['link'] = args['link'] or ''
    if args['link'] == '*none*' then args['link'] = '' end
 
    -- define args.possessive (default: '')
    args['possessive'] = args['possessive'] or ''
    if args['possessive'] == 'true' or args['possessive'] == '1' then args['possessive'] = true end
 
    -- define args.text (default: '')
    args['text'] = args['text'] or args['link'] or ''
    if args['text'] == '*none*' then args['text'] = '' end
    if args['possessive'] == true then
        if mw.ustring.sub(args['text'], -1) == 's' then
            args['text'] = args['text'] .. '\''
        else
            args['text'] = args['text'] .. '\'s'
        end
    end
 
    -- define args.alttext (default: '')
    args['alttext'] = args['alttext'] or ''
 
    -- define args.label (before or after; default: after)
    args['label'] = (({['after'] = 'after', ['before'] = 'before'})[args['label']]) or 'after'
    if args['image'] == '' then args['label'] = 'only' end
    if args['text'] == '' then args['label'] = 'none' end
 
    -- define args.labellink (true or false; default: true)
    args['labellink'] = args['labellink'] or true
    if args['labellink'] == 'false' or args['labellink'] == '0' then args['labellink'] = false end
 
    -- define args.separator (default: ' ')
    args['separator'] = args['separator'] or ' '
 
    local tag = lib.ternary(args['display'] == 'inline', 'span', 'div')
 
    local link = mw.html.create(tag):css('display', args['display']):addClass(args['display'] .. '-image')
    if args['class'] then link:addClass(args['class']) end
    if args['style'] then link:cssText(args['style']) end
 
    -- //img start
    local img = mw.html.create(tag)
    if args['image'] ~= '' then
        img:css({position = 'relative', display = 'inline-block'})
        local size = tostring(args['width'] or '') .. 'x' .. tostring(args['height'] or '') .. 'px'
        if args['iconclass'] then img:addClass(args['iconclass']) end
        if args['width'] then img:attr('data-width', tostring(args['width'])) end
        if args['height'] then img:attr('data-height', tostring(args['height'])) end
        if args['border'] == true then img:addClass('border') end
        if args['iconstyle'] then img:cssText(args['iconstyle']) end
        -- [[File:test.jpg|24px|border|link=test|testing]]
        img:wikitext(mw.ustring.format('[[File:%s%s%s|link=%s%s]]', 
            args['image'],
            lib.ternary(size == 'px', '', '|'..size),
            lib.ternary(args['border'], '|border', ''),
            lib.ternary(args['link'] == args['selflink'], '', args['link']),
            lib.ternary(args['alttext'] == '', 
                lib.ternary(args['text'] == '', '', '|' .. args['text']),
                '|' .. args['alttext']
            )
        ))
        if args['image2'] then
            img:wikitext(mw.ustring.format('[[File:%s%s%s|link=%s%s]]', 
                args['image2'],
                lib.ternary(size == 'px', '', '|'..size),
                lib.ternary(args['border'], '|border', ''),
                lib.ternary(args['link'] == args['selflink'], '', args['link']),
                lib.ternary(args['alttext'] == '', 
                lib.ternary(args['text'] == '', '', '|' .. args['text']),
                    '|' .. args['alttext']
                )
            ))
        end
        if args['image3'] then
            img:wikitext(mw.ustring.format('[[File:%s%s%s|link=%s%s]]', 
                args['image3'],
                lib.ternary(size == 'px', '', '|'..size),
                lib.ternary(args['border'], '|border', ''),
                lib.ternary(args['link'] == args['selflink'], '', args['link']),
                lib.ternary(args['alttext'] == '', 
                lib.ternary(args['text'] == '', '', '|' .. args['text']),
                    '|' .. args['alttext']
                )
            ))
        end
        -- //bottom right number start
        if args['number'] and args['number'] ~= '' then
            local number = mw.html.create('span')
            local t = {
                ['position'] = 'absolute',
                ['font-size'] = string.gsub(math.min(args['width'] or 1e309, args['height'] or 1e309), 'px', '')/2 ..'px',
                ['line-height'] = '1em',
                ['bottom'] = '0.08em',
                ['right'] = '0.1em',
                ['font-weight'] = 'bold',
                ['pointer-events'] = 'none',
                ['color'] = lib.ternary(args['blacknum'] == 'true', '#111', '#EEE'),
                ['text-shadow'] = lib.ternary(args['blacknum'] == 'true', '-1px 0 1px #fff, 0 1px 1px #fff, 1px 0 1px #fff, 0 -1px 1px #fff', '-1px 0 1px #000, 0 1px 1px #000, 1px 0 1px #000, 0 -1px 1px #000')
                }
            number:css(t)
            number:wikitext(args['number'])
            number:done()
            img:node(number)
        end
        -- //bottom right number end
        img:done()
    else
        img = nil
    end
    -- //img end
 
    -- //label start
    local label = mw.html.create(tag)
    if args['text'] ~= '' then
        link:addClass('label-' .. args['label'])
        if args['labelclass'] then label:addClass(args['labelclass']) end
        if args['labelstyle'] then label:cssText(args['labelstyle']) end
        if args['link'] == '' or args['labellink'] == false then
            label:wikitext(args['text'])
        elseif args['link'] == args['selflink'] then
            label:wikitext('<strong class="selflink">' .. args['text'] .. '</strong>')
        else
            label:wikitext(formatnil('[[%s|%s]]', args['link'], args['text']))
        end
        if args['edit'] == true and args['editlink'] ~= nil then
            label:wikitext(' <sup>[' .. tostring(mw.uri.fullUrl(args['editlink'], 'action=edit')) .. ' e]</sup>')
        end
        label:done()
    else
        label = nil
    end
    -- //label end
 
    if args['label'] == 'before' then
        if label then link:node(label) end
        if args['separator'] and img and label then link:wikitext(args['separator']) end
        if img then link:node(img) end
    else 
        if img then link:node(img) end
        if args['separator'] and img and label then link:wikitext(args['separator']) end
        if label then link:node(label) end
    end
 
    return link, img, label
end
 
function formatnil(text, ...)
    if select("#", ...) == 0 then return text end
    for i=1, select("#", ...) do
        if select(i, ...) == nil then return nil end
    end
    return mw.ustring.format(text, ...)
end
 
function getSize(size)
    local fields = HF.explode('x', mw.ustring.gsub(tostring(size or ''), 'px', '', 1))
    local width = tonumber(fields[1]) or nil
    local height = tonumber(fields[2]) or nil
    return width, height
end
 
return ImageLink
-- </pre>
-- [[Category:Lua]]