Модуль:Plain sister
Документацію для цього модуля можна створити у Модуль:Plain sister/документація
local HtmlBuilder = require('Модуль:HtmlBuilder')
local getArgs = require('Модуль:Arguments').getArgs
local Wikidata = require('Модуль:Wikidata')
local this = {}
local formatCommons = function(value)
return '<span class="plainlinks">[[Файл:Commons-logo.svg|16px|link=commons:Головна сторінка]] ['..tostring(mw.uri.fullUrl('commons:'..value, 'uselang=uk'))..' Галерея]</span>'
end
local formatCommonsCategory = function(value)
return '<span class="plainlinks">[[Файл:Commons-logo.svg|16px|link=commons:Головна сторінка]] ['..tostring(mw.uri.fullUrl('commons:Category:'..value, 'uselang=uk'))..' Категорія]</span>';
end
local sisterSites = {
{localParams={'вікіпедія', 'wikipedia'}, formatString='[[Файл:Wikipedia-logo.svg|20px|link=w:Головна сторінка]] [[w:%s|Вікістаття]]', wikidataSite='ukwiki'},
{localParams={'сховище', 'commons'}, formatFunction = formatCommons, wikidataSite='commonswiki'},
{localParams={'категорія_сховища', 'commonscat'}, formatFunction = formatCommonsCategory, wikidataProperty='P373'},
{localParams={'вікіцитати', 'wikiquote'}, formatString='[[Файл:Wikiquote-logo.svg|19px|link=q:Головна сторінка]] [[q:%s|Цитати]]', wikidataSite='ukwikiquote'},
{localParams={'вікіновини', 'wikinews'}, formatString='[[Файл:Wikinews-logo.svg|30px|link=n:Головна]] [[n:%s|Новини]]'},
{localParams={'вікісловник', 'wiktionary'}, formatString='[[Файл:Wiktionary-logo.svg|20px|link=wikt:Головна сторінка]] [[wikt:%s|Словник]]'},
{localParams={'вікіпідручник', 'wikibooks'}, formatString='[[Файл:Wikibooks-logo.svg|18px|link=b:Головна сторінка]] [[b:%s|Підручник]]'},
{localParams={'віківиди', 'wikispecies'}, formatString='[[Файл:Wikispecies-logo.svg|18px|link=wikispecies:Головна стаття]] [[wikispecies:%s|Віківиди]]'},
{localParams={'вікімандри', 'wikivoyage'}, formatString='[[Файл:Wikivoyage-Logo-v3-icon.svg|20px|link=voy:Головна сторінка]] [[voy:%s|Мандри]]', wikidataSite='ukwikivoyage'},
{localParams={'вікідані', 'wikidata'}, formatString='[[Файл:Wikidata-logo.svg|30px|link=d:Wikidata:Головна сторінка]] [[wikidata:%s|Вікідані]]', wikidataId=true},
{localParams={'метавікі', 'meta'}, formatString='[[Файл:Wikimedia_Community_Logo.svg|20px|link=m:Головна сторінка/uk]] [[meta:%s|Метавікі]]'},
}
local function createItem(list, image, link, alt)
local icon
if image ~= '' then
icon = '[[Файл:'..image..'|frameless|18px|link='..link..'|alt='..alt..']]'
else
icon = ''
end
local item = list
.tag('li')
.attr('class', 'sisitem')
.tag('span')
.attr('class', 'sisicon')
.cssText('padding-right:1ex;')
.wikitext(icon)
.done();
return item;
end
local getLocalValue = function(args, argNames)
for key, argName in pairs(argNames) do
local value = args[argName]
if value then
return value
end
end
return nil
end
local getWikilink = function(args, sisterSite)
local value = getLocalValue(args, sisterSite.localParams)
local wikidataValue = nil
if sisterSite.wikidataSite then
wikidataValue = Wikidata.getSitelink(sisterSite.wikidataSite)
elseif sisterSite.wikidataProperty then
wikidataValue = Wikidata.getRawValue(sisterSite.wikidataProperty)
elseif sisterSite.wikidataId then
wikidataValue = Wikidata.getId()
else
wikidataValue = "N/A"
end
local migrationNeeded = false
if wikidataValue ~= "N/A" then
if value then
migrationNeeded = true
else
value = wikidataValue
end
end
if value == nil then
return nil, migrationNeeded
end
if sisterSite.formatString then
return string.format(sisterSite.formatString, value), migrationNeeded
end
return sisterSite.formatFunction(value), migrationNeeded
end
function this.main(frame)
-- parse arguments
local args = getArgs(frame);
local portal = args['портал'] or args['portal'];
local related_author = args['пов\'язаний_автор'] or args['related_author'];
local list = HtmlBuilder.create('ul')
.attr('id', 'plainSister')
.addClass('nowraplinks')
.cssText('display:inline-block; font-size:90%; list-style-type:none;'
..'list-style-image:none; list-style-position:outside; border-top:0 #aaa solid;'
..'float:right; clear:right; margin:0 0 0.5ex 0.5ex;'
..'padding:0 0 0 0;');
local anythingToShow = false
--portal
if portal then
local item = createItem(list, 'Wikisource-logo.svg', 'Портал:Портали', 'Пов\'язані портали');
local portals = mw.text.split(portal, '/');
for i=1, #portals do
portals[i] = '[[Портал:'..portals[i]..'|'..portals[i]..']]';
end
item.wikitext('[[Портал:Портали|пов\'язані портали]]: '..table.concat(portals, ', '));
anythingToShow = true
end
--related_author
if related_author then
local item = createItem(list, 'System-users.svg', ':Категорія:Автори', 'Пов\'язані автори');
local related_authors = mw.text.split(related_author, '/');
for i=1, #related_authors do
related_authors[i] = '[[Автор:'..related_authors[i]..'|'..related_authors[i]..']]';
end
item.wikitext('[[:Категорія:Автори|пов\'язані автори]]: '..table.concat(related_authors, ', '));
anythingToShow = true;
end
--sister projects
local sisters = {};
local migrationNeeded = false
for key, sisterSite in pairs(sisterSites) do
local sisterLink, migrate = getWikilink(args, sisterSite)
if sisterLink then
sisters[#sisters+1] = sisterLink;
end;
if migrate then
migrationNeeded = true
end
end
if #sisters > 0 then
-- Wikimedia-logo.svg
local item = createItem(list, '', 'Спеціальна:Матриця сайту', 'Сестринські проєкти');
item.wikitext(table.concat(sisters, ' • '));
anythingToShow = true
end
if not anythingToShow then
return ""
end
local result = tostring(list);
if migrationNeeded then
result = result..'[[Категорія:Дані до перенесення до Вікіданих]]'
end
return frame:preprocess(result);
end
return this;