Модуль: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">['..tostring(mw.uri.fullUrl('commons:'..value, 'uselang=uk'))..' галерея Сховища]</span>'
end

local formatCommonsCategory = function(value)
    return '<span class="plainlinks">['..tostring(mw.uri.fullUrl('commons:Category:'..value, 'uselang=uk'))..' категорія Сховища]</span>';
end

local sisterSites = {
    {localParams={'вікіпедія', 'wikipedia'}, formatString='[[w:%s|стаття Вікіпедії]]', wikidataSite='ukwiki'},
    {localParams={'сховище', 'commons'}, formatFunction = formatCommons, wikidataSite='commonswiki'},
    {localParams={'категорія_сховища', 'commonscat'}, formatFunction = formatCommonsCategory, wikidataProperty='P373'},
    {localParams={'вікіцитати', 'wikiquote'}, formatString='[[q:%s|цитати]]', wikidataSite='ukwikiquote'},
    {localParams={'вікіновини', 'wikinews'}, formatString='[[n:%s|новини]]'},
    {localParams={'вікісловник', 'wiktionary'}, formatString='[[wikt:%s|визначення]]'},
    {localParams={'вікіпідручник', 'wikibooks'}, formatString='[[b:%s|підручник]]'},
    {localParams={'віківиди', 'wikispecies'}, formatString='[[wikispecies:%s|таксономія]]'},
    {localParams={'вікімандри', 'wikivoyage'}, formatString='[[voy:%s|путівник]]', wikidataSite='ukwikivoyage'},
    {localParams={'вікідані', 'wikidata'}, formatString='[[wikidata:%s|дані]]', wikidataId=true},
    {localParams={'метавікі', 'meta'}, formatString='[[meta:%s|метавікі]]'},
}

local function createItem(list, image, link, alt)
    local item = list
        .tag('li')
            .attr('class', 'sisitem')
            .tag('span')
                .attr('class', 'sisicon')
                .cssText('padding-right:1ex;')
                .wikitext('[[Файл:'..image..'|frameless|18px|link='..link..'|alt='..alt..']]')
                .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:1px #aaa solid;'
            ..'float:right; clear:right; margin:0.0ex 0.0ex 0.5ex 0.5ex;'
            ..'padding:0.0ex 0.0ex 0.0ex 0.0ex; background:#fff; background-color:#fff;');

    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
        local item = createItem(list, 'Wikimedia-logo.svg', 'Спеціальна:Матриця сайту', 'Сестринські проекти');
        item.wikitext('[[Спеціальна:Матриця сайту|сестринські проекти]]:&#32;'..table.concat(sisters, ',&#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;