Aller au contenu

Module:Delink

Cette page fait l’objet d’une mesure de semi-protection étendue.
Une page de Wikipédia, l'encyclopédie libre.

 Documentation[créer] [purger]
-- This module de-links most wikitext.

local p = {}

local function delinkReversePipeTrick(s)
    if s:find('^%[%[|.*[|\n]') or s == '[[|]]' then -- Check for newlines or multiple pipes.
        return s
    else
        return s:match('%[%[|(.*)%]%]')
    end
end

local function delinkPipeTrick(s)
    -- s the tile area, without bracket nor pipe
    -- We need to deal with colons, brackets, and commas, per [[Help:Pipe trick]].

    -- First, remove the text before the first colon, if any.
    s = s:gsub('^(.-:)', '')

    -- Next up, brackets and commas.
    if s:find('%(.-%)$') then -- Brackets trump commas.
        s = s:match('(.-) ?%(.-%)$')
    elseif s:find(',') then -- If there are no brackets, display only the text before the first comma.
        s = s:match('(.-),.*$')
    end
    return s
end

local function delinkWikilink(s)
    -- s is a string starting with '[[' and ending with ']]'. It does not contain any other ']]' strings.

    -- Deal with nested links
    local nested = '[[' .. s:sub(3):gsub('%[%[.-%]%]$', delinkWikilink)
    if nested ~= s then
        return nested
    end

    -- Deal with the reverse pipe trick.
    if s:find('^%[%[|') then
        return delinkReversePipeTrick(s)
    end

    -- Check for bad titles. To do this we need to find the
    -- title area of the link, i.e. the part before any pipes.
    local titlearea, display = s:match('^%[%[(.-)|(.*)%]%]$')
    titlearea = titlearea or s:sub(3, -3)

    titlearea = mw.uri.decode(titlearea, 'PATH') -- decode percent-encoded entities. Leave underscores and plus signs.
    titlearea = mw.text.decode(titlearea, true) -- decode HTML entities.

    local temptitlearea, fragment = titlearea:match('^(.-)#(.*)$')
    temptitlearea = temptitlearea or titlearea
    fragment = fragment or ''

    -- Check for bad characters.
    if not mw.ustring.isutf8(titlearea)
        or temptitlearea:find('[%[%]<>|{}%z%c\n]')
        or temptitlearea:find('%%%x%x')
        or temptitlearea:find('&..-;')
        or fragment:find('[%[%]{}%c\n]')
    then
        return s
    end


    -- Check for categories, interwikis, and files.
    local colonprefix = titlearea:match('^(.-):') or '' -- Get the text before the first colon.
    local ns = mw.site.namespaces[colonprefix] -- see if this is a known namespace
    if mw.language.isKnownLanguageTag(colonprefix)
        or ns and (ns.id == 6 or ns.id == 14)
    then
        return ''
    end

    -- Remove the colon if the link is using the [[Help:Colon trick]].
    if titlearea:sub(1, 1) == ':' then
        titlearea = titlearea:sub(2)
    end

    -- Deal with links using the [[Help:Pipe trick]].
    if display == '' then
        return delinkPipeTrick(titlearea)
    end

    -- Find the display area of the wikilink
    if not display then -- Find if we're dealing with a piped link.
        -- Remove new lines from the display of multiline piped links,
        -- where the pipe is before the first new line.
        titlearea = titlearea:gsub('\n', '')
    end

    return display or titlearea
end

local function delinkURL(s)
    -- Assume we have already delinked internal wikilinks, and that
    -- we have been passed some text between two square brackets [foo].

    -- If the text contains a line break it is not formatted as a URL, regardless of other content.
    if s:find('\n') then
        return s
    end

    -- Check if the text has a valid URL prefix and at least one valid URL character.
    local valid_url_prefixes = {'//', 'http://', 'https://', 'ftp://', 'gopher://', 'mailto:', 'news:', 'irc://'}
    local url_prefix
    for i,v in ipairs(valid_url_prefixes) do
        if s:find( '^%[' .. v ..'[^"%s].*%]' ) then
            url_prefix = v
            break
        end
    end

    -- Get display text
    if not url_prefix then
        -- Deal with nested links or send back original string.
        return "[" .. mw.ustring.gsub( mw.ustring.sub(s, 2), "%[.-%]", delinkURL )
    end
    s = s:match('^%[' .. url_prefix .. '(.*)%]') -- Grab all of the text after the URL prefix and before the final square bracket.
    s = s:match('^.-(["<> [].*)') or '' -- Grab all of the text after the first URL separator character ("<> ).
    s = s:match('^%s*(%S.*)$') or '' -- If the separating character was a space, trim it off.

    local s_decoded = mw.text.decode(s, true)
    if s_decoded:find('%c') then
        return s
    else
        return s_decoded
    end
end


function p._delink(args)
    local text = args[1] or ''
    if args.refs == 'yes' then
        -- Remove any [[Help:Strip markers]] representing ref tags. In most situations
        -- this is not a good idea - only use it if you know what you are doing!
        text = mw.text.unstrip(text)
    end
    if not (args.comments == 'no') then
        text = text:gsub('<!%-%-.-%-%->', '') -- Remove html comments.
    end
    if not (args.wikilinks == 'no') then
        text = text:gsub('%[%[.-%]%]', delinkWikilink) -- De-link wikilinks.
    end
    if not (args.urls == 'no') then
        text = text:gsub('%[.-%]', delinkURL) -- De-link URLs.
    end
    if not (args.whitespace == 'no') then
        -- Replace single new lines with a single space, but leave double new lines
        -- and new lines only containing spaces or tabs before a second new line.
        text = text:gsub('([^\n \t])[ \t]*\n\t*([^\n \t])', '%1 %2')
        text = text:gsub('\n\t+', '\n') -- Remove leading tab.
        text = text:gsub('[ \t]+', ' ') -- Remove extra tabs and spaces.
    end
    if not (args.nowiki == 'no') then
        text = mw.text.unstripNoWiki(text)
    end
    return text
end

function p.delink(frame)
    local args
    if frame == mw.getCurrentFrame() then
        -- We're being called via #invoke. If the invoking template passed any args, use
        -- them. Otherwise, use the args that were passed into the template.
        args = frame:getParent().args
        for k, v in pairs(frame.args) do
            args = frame.args
            break
        end
    else
        -- We're being called from another module or from the debug console, so assume
        -- the args are passed in directly.
        args = frame
    end
    return p._delink(args)
end

return p
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy