Перейти до вмісту

Модуль: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:Головна сторінка]]&nbsp;['..tostring(mw.uri.fullUrl('commons:'..value, 'uselang=uk'))..' Галерея]</span>'
end

local formatCommonsCategory = function(value)
    return '<span class="plainlinks">[[Файл:Commons-logo.svg|16px|link=commons:Головна сторінка]]&nbsp;['..tostring(mw.uri.fullUrl('commons:Category:'..value, 'uselang=uk'))..' Категорія]</span>';
end

local sisterSites = {
    {localParams={'вікіпедія', 'wikipedia'}, formatString='[[Файл:Wikipedia-logo.svg|20px|link=w:Головна сторінка]]&nbsp;[[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:Головна сторінка]]&nbsp;[[q:%s|Цитати]]', wikidataSite='ukwikiquote'},
    {localParams={'вікіновини', 'wikinews'}, formatString='[[Файл:Wikinews-logo.svg|30px|link=n:Головна]]&nbsp;[[n:%s|Новини]]'},
    {localParams={'вікісловник', 'wiktionary'}, formatString='[[Файл:Wiktionary-logo.svg|20px|link=wikt:Головна сторінка]]&nbsp;[[wikt:%s|Словник]]'},
    {localParams={'вікіпідручник', 'wikibooks'}, formatString='[[Файл:Wikibooks-logo.svg|18px|link=b:Головна сторінка]]&nbsp;[[b:%s|Підручник]]'},
    {localParams={'віківиди', 'wikispecies'}, formatString='[[Файл:Wikispecies-logo.svg|18px|link=wikispecies:Головна стаття]]&nbsp;[[wikispecies:%s|Віківиди]]'},
    {localParams={'вікімандри', 'wikivoyage'}, formatString='[[Файл:Wikivoyage-Logo-v3-icon.svg|20px|link=voy:Головна сторінка]]&nbsp;[[voy:%s|Мандри]]', wikidataSite='ukwikivoyage'},
    {localParams={'вікідані', 'wikidata'}, formatString='[[Файл:Wikidata-logo.svg|30px|link=d:Wikidata:Головна сторінка]]&nbsp;[[wikidata:%s|Вікідані]]', wikidataId=true},
    {localParams={'метавікі', 'meta'}, formatString='[[Файл:Wikimedia_Community_Logo.svg|20px|link=m:Головна сторінка/uk]]&nbsp;[[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('[[Портал:Портали|пов\'язані портали]]:&#32;'..table.concat(portals, ',&#32;'));
        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('[[:Категорія:Автори|пов\'язані автори]]:&#32;'..table.concat(related_authors, ',&#32;'));
        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, '&#32;•&#32;'));
        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;