Module:Delink
From Zoophilia Wiki
This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
This Lua module is used on 2,100,000+ pages, or roughly 30928% of all pages. To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Consider discussing changes on the talk page before implementing them. |
This module implements the {{delink}} template. Please see the template page for documentation.
-- This module de-links one internal wikilink. It doesn't handle bad links, or links that use the pipe trick.
p = {}
local function delinkPipeTrick(s)
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]].
-- First, we check whether or not there are colons in the link, and trim it accordingly.
if mw.ustring.match(s, ":") then
-- If the link contains a colon, it could be a category or an interwiki,
-- or it could use the [[Help:Colon trick]].
-- Check for categories and interwikis.
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$") then
s = ""
-- Check for the colon trick.
elseif mw.ustring.match(s, "%[%[:") then
s = mw.ustring.match(s, "%[%[:.-:(.*)|%]%]")
-- Otherwise, remove the text before the first colon.
else
s = mw.ustring.match(s, "%[%[.-:(.*)|%]%]")
end
-- 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(text)
if mw.ustring.match(text, "[^|].*|%]%]") or mw.ustring.match(text, "%[%[|") then -- Weed out the pipe tricks first.
return delinkPipeTrick(text)
end
-- Find the link area and display area of the wikilink
local linkarea, display
if mw.ustring.match(text, "|") then -- Find if we're dealing with a piped link.
linkarea, display = mw.ustring.match(text, "^%[%[(.-)|(.+)%]%]")
else
-- If the link isn't piped, the display area and the link area are the same.
linkarea = mw.ustring.match(text, "^%[%[(.-)%]%]")
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
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