Модуль:ImageLink: различия между версиями
(Новая страница: «local ImageLink = {} local lib = require('Module:Feature') return ImageLink») |
Нет описания правки Метка: ручная отмена |
||
(не показаны 24 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
local ImageLink = {} | local ImageLink = {} | ||
local lib | local FN = require("Module:Filename") | ||
local lib = require('Module:Feature') | |||
function ImageLink.hero(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['hero'] or '' | |||
args['text'] = args['text'] or args['hero'] or '' | |||
args['image'] = args['image'] or FN.herosquare(args) | |||
args['editlink'] = args['editlink'] or "Модуль:HeroData/data" | |||
args['selflink'] = args['selflink'] or mw.title.getCurrentTitle().rootText | |||
local link, img = ImageLink._createLink(args) | |||
link:addClass('tooltip-link') | |||
if args['hero'] then link:attr('data-tooltip', "hero") end | |||
if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end | |||
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 | |||
if args['style'] ~= '*none*' then args['style'] = args['style'] .. ';' .. 'line-height:' .. args['size'] + 2 .. 'px' 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('hero-icon-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 | return ImageLink |
Текущая версия от 21:04, 3 января 2022
local ImageLink = {} local FN = require("Module:Filename") local lib = require('Module:Feature') function ImageLink.hero(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['hero'] or '' args['text'] = args['text'] or args['hero'] or '' args['image'] = args['image'] or FN.herosquare(args) args['editlink'] = args['editlink'] or "Модуль:HeroData/data" args['selflink'] = args['selflink'] or mw.title.getCurrentTitle().rootText local link, img = ImageLink._createLink(args) link:addClass('tooltip-link') if args['hero'] then link:attr('data-tooltip', "hero") end if args['width'] and img ~= nil then img:addClass('icon-' .. args['width']) end 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 if args['style'] ~= '*none*' then args['style'] = args['style'] .. ';' .. 'line-height:' .. args['size'] + 2 .. 'px' 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('hero-icon-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