Module:Delink: Difference between revisions

From the Croc Wiki, the Croc encyclopedia
Jump to navigationJump to search
Content added Content deleted
(move the colon trick processing to earlier in the chain)
(deal with most bad links)
Line 2: Line 2:


p = {}
p = {}

local function delinkReversePipeTrick(s)
return mw.ustring.match(s, "%[%[|(.*)%]%]")
end


local function delinkPipeTrick(s)
local function delinkPipeTrick(s)
local linkarea, display = "", ""
local linkarea, display = "", ""
-- Deal with the left-hand pipe trick, an easy case.
if mw.ustring.match(s, "%[%[|") then
return mw.ustring.match(s, "%[%[|(.*)%]%]")
end
-- If the link isn't a left-hand pipe trick, assume it's a right-hand pipe trick.
-- We need to deal with colons, brackets, and commas, per [[Help:Pipe trick]].
-- We need to deal with colons, brackets, and commas, per [[Help:Pipe trick]].
Line 32: Line 29:


local function delinkOne(s)
local function delinkOne(s)
-- First, check for categories, interwikis, and files.
-- Deal with the reverse pipe trick, an easy case.
if mw.ustring.match(s, "%[%[|") 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
if mw.ustring.match(s, "|") then -- Find if we're dealing with a piped link.
titlearea= mw.ustring.match(s, "^%[%[(.-)|.*%]%]")
else
titlearea = mw.ustring.match(s, "^%[%[(.-)%]%]")
end
-- Clear the title of the fragment (the section link).
if not mw.title.makeTitle("", titlearea) then
return s -- If it's not a valid link, return the whole string.
end
-- Check for categories, interwikis, and files.
local colonprefix = mw.ustring.match(s, "%[%[(.-):.*%]%]") or "" -- Get the text before the first colon.
local colonprefix = mw.ustring.match(s, "%[%[(.-):.*%]%]") or "" -- Get the text before the first colon.
if mw.language.isKnownLanguageTag(colonprefix)
if mw.language.isKnownLanguageTag(colonprefix)
Line 46: Line 61:
end
end
-- Deal with links using the [[Help:Pipe trick]].
if mw.ustring.match(s, "[^|].*|%]%]") or mw.ustring.match(s, "%[%[|") then -- Weed out the pipe tricks first.
if mw.ustring.match(s, "[^|].*|%]%]") or mw.ustring.match(s, "%[%[|") then
return delinkPipeTrick(s)
return delinkPipeTrick(s)
end
end
-- Find the link area and display area of the wikilink
local linkarea, display
-- Find the display area of the wikilink
local display
if mw.ustring.match(s, "|") then -- Find if we're dealing with a piped link.
if mw.ustring.match(s, "|") then -- Find if we're dealing with a piped link.
linkarea, display = mw.ustring.match(s, "^%[%[(.-)|(.+)%]%]")
display = mw.ustring.match(s, "^%[%[.-|(.+)%]%]")
else
else
display = mw.ustring.match(s, "^%[%[(.-)%]%]")
-- If the link isn't piped, the display area and the link area are the same.
linkarea = mw.ustring.match(s, "^%[%[(.-)%]%]")
display = linkarea
end
-- Check for bad links
if mw.ustring.match(linkarea, "%[") or mw.ustring.match(linkarea, "%]") then
error("Bad link detected. Bad links are not yet supported.")
end
end

return display
return display
end
end

Revision as of 13:33, April 3, 2013

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

-- This module de-links one internal wikilink. It doesn't handle bad links, or links that use the pipe trick.

p = {}

local function delinkReversePipeTrick(s)
    return mw.ustring.match(s, "%[%[|(.*)%]%]")
end

local function delinkPipeTrick(s)
    local linkarea, display = "", ""
    -- We need to deal with colons, brackets, and commas, per [[Help:Pipe trick]].
    
    -- First, remove the text before the first colon, if any.
    if mw.ustring.match(s, ":") then
        s = mw.ustring.match(s, "%[%[.-:(.*)|%]%]")
    -- If there are no colons, grab all of the text apart from the square brackets and the pipe.
    else
        s = mw.ustring.match(s, "%[%[(.*)|%]%]")
    end
    
    -- Next up, brackets and commas.
    if mw.ustring.match(s, "%(.-%)$") then -- Brackets trump commas.
        s = mw.ustring.match(s, "(.-) ?%(.-%)$")
    elseif mw.ustring.match(s, ",") then -- If there are no brackets, display only the text before the first comma.
        s = mw.ustring.match(s, "(.-),.*$")
    end
    return s
end

local function delinkOne(s)
    -- Deal with the reverse pipe trick, an easy case.
    if mw.ustring.match(s, "%[%[|") 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
    if mw.ustring.match(s, "|") then -- Find if we're dealing with a piped link.
        titlearea= mw.ustring.match(s, "^%[%[(.-)|.*%]%]")
    else
        titlearea = mw.ustring.match(s, "^%[%[(.-)%]%]")
    end
    -- Clear the title of the fragment (the section link).
    if not mw.title.makeTitle("", titlearea) then
        return s -- If it's not a valid link, return the whole string.
    end
    
    -- Check for categories, interwikis, and files.
    local colonprefix = mw.ustring.match(s, "%[%[(.-):.*%]%]") or "" -- Get the text before the first colon.
    if mw.language.isKnownLanguageTag(colonprefix)
    or mw.ustring.match(colonprefix, "^[Cc]ategory$")
    or mw.ustring.match(colonprefix, "^[Ff]ile$")
    or mw.ustring.match(colonprefix, "^[Ii]mage$") then
        return ""
    end
    
    -- Remove the colon if the link is using the [[Help:Colon trick]].
    if mw.ustring.match(s, "%[%[:") then
        s = "[[" .. mw.ustring.match(s, "%[%[:(.*%]%])")
    end
    
    -- Deal with links using the [[Help:Pipe trick]].
    if mw.ustring.match(s, "[^|].*|%]%]") or mw.ustring.match(s, "%[%[|") then
        return delinkPipeTrick(s)
    end
    
    -- Find the display area of the wikilink
    local display
    if mw.ustring.match(s, "|") then -- Find if we're dealing with a piped link.
        display = mw.ustring.match(s, "^%[%[.-|(.+)%]%]")
    else
        display = mw.ustring.match(s, "^%[%[(.-)%]%]")
    end

    return display
end

local function _delink(args)
    local text = args[1] or ""
    text = mw.ustring.gsub(text, "%[%[.-%]%]", delinkOne)
    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 _delink(args)
end

return p