Module:LinkTemplate

From The Satanic Wiki
Revision as of 02:23, 30 April 2021 by WikiGOD (talk | contribs) (1 revision imported)
Jump to navigation Jump to search

Documentation for this module may be created at Module:LinkTemplate/doc

-- @protect      <nowiki>
-- @module       LinkTemplate
-- @description  Module for creating link templates.
-- @version      1.4
-- @usage        require('Dev:LinkTemplate')
-- @author       TheGoldenPatrik1
-- @release      Stable

local p = {}
local i18n = require('Dev:I18n').loadMessages('LinkTemplate')
local userError = require('Dev:User error')

-- @method       p.full
-- @description  Creates an fullurl link with URL parameters
-- @param        {String} link - The page to link to
-- @param        {String} params - The URL parameters
-- @param        {String} text - The link text
function p.full(link, params, text)
    return '<span class="plainlinks">[' .. tostring(mw.uri.canonicalUrl(link, params)) .. ' ' .. (text or link) .. ']</span>'
end

-- @method       p.link
-- @description  Creates an internal link
-- @param        {String} link - The page to link to
-- @param        {String} text - The link text
function p.link(link, text)
    return '[[:' .. link .. '|' .. (text or link) .. ']]'
end

-- @method       p.plain
-- @description  Creates an external plainlink
-- @param        {String} link - The URL to link to
-- @param        {String} text - The link text
function p.plain(link, text)
    return '<span class="plainlinks">[' .. link .. ' ' .. text .. ']</span>'
end

-- @method       p.external
-- @description  Creates plainlinks to other websites
-- @param        {String} defaultLink - The default link
-- @param        {String} defaultText - The default text
-- @param        {String} paramA - The first arg
-- @param        {String} paramB - The second arg
function p.external(defaultLink, defaultText, paramA, paramB)
    if defaultLink then
        return p.plain(defaultLink, paramA or defaultText or defaultLink)
    elseif paramA then
        return p.plain(paramA, paramB or defaultText or paramA)
    end
end

-- @method       p.interwiki
-- @description  Generates interwiki links
-- @param        {String} prefix - The link prefix
-- @param        {String} suffix - The link suffix
-- @param        {String} wiki - The wiki to link to
-- @param        {String} wikiName - The wiki's name
-- @param        {String} paramA - The first arg
-- @param        {String} paramB - The second arg
-- @param        {String} url - The url arg
function p.interwiki(prefix, suffix, wiki, wikiName, paramA, paramB, url)
    if url then
        local uri = url:gsub('-', '=')
        if not paramA then
            return p.full(prefix .. wiki .. suffix, uri, paramB or wikiName)
        elseif paramB == 'f' or paramB == 'F' then
            return p.full(prefix .. wiki .. ':' .. paramA, uri, prefix .. wiki .. ':' .. paramA)
        else
            return p.full(prefix .. wiki .. ':' .. paramA, uri, paramB or paramA)
        end
    elseif not paramA then
        return p.link(prefix .. wiki .. suffix, paramB or wikiName)
    elseif paramB == 'f' or paramB == 'F' then
        return p.link(prefix .. wiki .. ':' .. paramA, prefix .. wiki .. ':' .. paramA)
    else
        return p.link(prefix .. wiki .. ':' .. paramA, paramB or paramA)
    end
end

-- @method       p.namespace
-- @description  Generates namespace links
-- @param        {String} namespace - The namespace to link to
-- @param        {String} paramA - The first arg
-- @param        {String} paramB - The second arg
-- @param        {String} url - The url arg
function p.namespace(namespace, paramA, paramB, url)
    local ns = mw.site.namespaces[tonumber(namespace)].name
    local title = i18n:useContentLang():msg('ns', ns .. ':')
    local special = i18n:useContentLang():msg('special', ns)
    if url then
        local uri = url:gsub('-', '=')
        if not paramA then
            if namespace == '-1' then
                return p.full('Special:SpecialPages', uri, paramB or '<span title=\"' .. special .. '\">' .. ns .. '</span>')
            else
                return p.full('Special:PrefixIndex/' .. ns .. ':', uri, paramB or '<span title=\"' .. title .. '\">' .. ns .. '</span>')
            end
        elseif paramB == 'f' or paramB == 'F' then
            return p.full(ns .. ':' .. paramA, uri)
        else
            return p.full(ns .. ':' .. paramA, uri, paramB or paramA)
        end
    elseif not paramA then
        if namespace == '-1' then
            return p.link('Special:SpecialPages', paramB or '<span title=\"' .. special .. '\">' .. ns .. '</span>')
        else
            return p.link('Special:PrefixIndex/' .. ns .. ':', paramB or '<span title=\"' .. title .. '\">' .. ns .. '</span>')
        end
    elseif paramB == 'f' or paramB == 'F' then
        return p.link(ns .. ':' .. paramA)
    else
        return p.link(ns .. ':' .. paramA, paramB or paramA)
    end
end

-- @method       p.page
-- @description  Generates links to pages
-- @param        {String} page - The page to link to
-- @param        {String} defaultText - The template's default text
-- @param        {String} paramA - The first arg
-- @param        {String} url - The url arg
function p.page(page, defaultText, paramA, url)
    if url then
        return p.full(page, url:gsub('-', '='), paramA or defaultText or page)
    else
        return p.link(page, paramA or defaultText or page)
    end
end

-- @method       p.main
-- @description  The main function; determines what to do
-- @param        {String} frame - User input
function p.main(frame)
    local linkType = frame.args[1]
    local data = frame.args[2]
    local defaultText = frame.args[3]
    local pargs = frame:getParent().args
    local paramA = pargs[1]
    local paramB = pargs[2]
    local url = pargs['url']
    local cat = 'Pages with user errors'
    if linkType == 'ns' then
        if data then
            return p.namespace(data, paramA, paramB, url)
        else
            return userError('no namespace specified', cat)
        end
    elseif linkType == 'wiki' then
        if data and defaultText then
            return p.interwiki('w:c:', '', data, defaultText, paramA, paramB, url)
        else
            return userError('no wiki specified', cat)
        end
    elseif linkType == 'mediawiki' then
        if data and defaultText then
            return p.interwiki('', ':', data, defaultText, paramA, paramB, url)
        else
            return userError('no data specified', cat)
        end
    elseif linkType == 'page' then
        if data then
            return p.page(data, defaultText, paramA, url)
        else
            return userError('no page specified', cat)
        end
    elseif linkType == 'external' then
        return p.external(data, defaultText, paramA, paramB)
    else
        return userError('invalid link type', cat)
    end
end

return p