Module:Delink
Appearance
Documentation for this module may be created atModule:Delink/doc
-- This module de-links most wikitext.
require("strict")
localp={}
localgetArgs
localfunctiondelinkReversePipeTrick(s)
ifs:match("^%[%[|.*[|\n] ")then-- Check for newlines or multiple pipes.
returns
end
returns:match("%[%[|(.*)%]%]")
end
localfunctiondelinkPipeTrick(s)
-- We need to deal with colons, brackets, and commas, per [[Help:Pipe trick]].
-- First, remove the text before the first colon, if any.
ifs:match(":")then
s=s:match("%[%[.-:(.*)|%]%]")
-- If there are no colons, grab all of the text apart from the square brackets and the pipe.
else
s=s:match("%[%[(.*)|%]%]")
end
-- Next up, brackets and commas.
ifs:match("%(.-%)$")then-- Brackets trump commas.
s=s:match("(.-)?%(.-%)$")
elseifs:match(",")then-- If there are no brackets, display only the text before the first comma.
s=s:match("(.-),.*$")
end
returns
end
-- Return wikilink target |wikilinks=target
localfunctiongetDelinkedTarget(s)
localresult=s
-- Deal with the reverse pipe trick.
ifresult:match("%[%[|")then
returndelinkReversePipeTrick(result)
end
result=mw.uri.decode(result,"PATH")-- decode percent-encoded entities. Leave underscores and plus signs.
result=mw.text.decode(result,true)-- decode HTML entities.
-- Check for bad titles. To do this we need to find the
-- title area of the link, i.e. the part before any pipes.
localtarget_area
ifresult:match("|")then-- Find if we're dealing with a piped link.
target_area=result:match("^%[%[(.-)|.*%]%]")
else
target_area=result:match("^%[%[(.-)%]%]")
end
-- Check for bad characters.
ifmw.ustring.match(target_area,"[%[%]<>{}%%%c\n] ")andmw.ustring.match(target_area,"[%[%]<>{}%%%c\n] ")~="?"then
returns
end
returntarget_area
end
localfunctiongetDelinkedLabel(s)
localresult=s
-- Deal with the reverse pipe trick.
ifresult:match("%[%[|")then
returndelinkReversePipeTrick(result)
end
result=mw.uri.decode(result,"PATH")-- decode percent-encoded entities. Leave underscores and plus signs.
result=mw.text.decode(result,true)-- decode HTML entities.
-- Check for bad titles. To do this we need to find the
-- title area of the link, i.e. the part before any pipes.
localtarget_area
ifresult:match("|")then-- Find if we're dealing with a piped link.
target_area=result:match("^%[%[(.-)|.*%]%]")
else
target_area=result:match("^%[%[(.-)%]%]")
end
-- Check for bad characters.
ifmw.ustring.match(target_area,"[%[%]<>{}%%%c\n] ")andmw.ustring.match(target_area,"[%[%]<>{}%%%c\n] ")~="?"then
returns
end
-- Check for categories, interwikis, and files.
localcolon_prefix=result:match("%[%[(.-):.*%]%]")or""-- Get the text before the first colon.
localns=mw.site.namespaces[colon_prefix]-- see if this is a known namespace
ifmw.language.isKnownLanguageTag(colon_prefix)or(nsand(ns.canonicalName=="File"orns.canonicalName=="Category"))then
return""
end
-- Remove the colon if the link is using the [[Help:Colon trick]].
ifresult:match("%[%[:")then
result="[["..result:match("%[%[:(.*%]%])")
end
-- Deal with links using the [[Help:Pipe trick]].
ifmw.ustring.match(result,"^%[%[[^|]*|%]%]")then
returndelinkPipeTrick(result)
end
-- Find the display area of the wikilink
ifresult:match("|")then-- Find if we're dealing with a piped link.
result=result:match("^%[%[.-|(.+)%]%]")
-- Remove new lines from the display of multiline piped links,
-- where the pipe is before the first new line.
result=result:gsub("\n","")
else
result=result:match("^%[%[(.-)%]%]")
end
returnresult
end
localfunctiondelinkURL(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.
ifs:match("\n")then
returns
end
-- Check if the text has a valid URL prefix and at least one valid URL character.
localvalid_url_prefixes={"//","http://","https://","ftp://","gopher://","mailto:","news:","irc://"}
localurl_prefix
for_,vinipairs(valid_url_prefixes)do
ifmw.ustring.match(s,'^%['..v..'[^ "%s].*%]')then
url_prefix=v
break
end
end
-- Get display text
ifnoturl_prefixthen
returns
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=mw.ustring.match(s,"^%s*(%S.*)$")or""-- If the separating character was a space, trim it off.
locals_decoded=mw.text.decode(s,true)
ifmw.ustring.match(s_decoded,"%c")then
returns
end
returns_decoded
end
localfunctiondelinkLinkClass(text,pattern,delinkFunction)
iftype(text)~="string"then
error("Attempt to de-link non-string input.",2)
end
iftype(pattern)~="string"ormw.ustring.sub(pattern,1,1)~="^"then
error('Invalid pattern detected. Patterns must begin with "^".',2)
end
-- Iterate over the text string, and replace any matched text. using the
-- delink function. We need to iterate character by character rather
-- than just use gsub, otherwise nested links aren't detected properly.
localresult=""
whiletext~=""do
-- Replace text using one iteration of gsub.
text=mw.ustring.gsub(text,pattern,delinkFunction,1)
-- Append the left-most character to the result string.
result=result..mw.ustring.sub(text,1,1)
text=mw.ustring.sub(text,2,-1)
end
returnresult
end
functionp._delink(args)
localtext=args[1]or""
ifargs.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.ustring.gsub(text,"UNIQ%w*%-ref%-%d*%-QINU","")
end
ifargs.comments~="no"then
text=text:gsub("<!%-%-.-%-%->","")-- Remove html comments.
end
ifargs.wikilinks~="no"andargs.wikilinks~="target"then
-- De-link wikilinks and return the label portion of the wikilink.
text=delinkLinkClass(text,"^%[%[.-%]%]",getDelinkedLabel)
elseifargs.wikilinks=="target"then
-- De-link wikilinks and return the target portions of the wikilink.
text=delinkLinkClass(text,"^%[%[.-%]%]",getDelinkedTarget)
end
ifargs.urls~="no"then
text=delinkLinkClass(text,"^%[.-%]",delinkURL)-- De-link URLs.
end
ifargs.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=mw.ustring.gsub(text,"([^\n\t][\t]*)\n([\t]*[^\n\t]) ","%1 %2")
text=text:gsub("[\t]+ ","")-- Remove extra tabs and spaces.
end
returntext
end
functionp.delink(frame)
ifnotgetArgsthen
getArgs=require('Module:Arguments').getArgs
end
returnp._delink(getArgs(frame,{wrappers='Template:Delink'}))
end
returnp