-- This module de-links most wikitext.require("strict")localp={}localgetArgslocalfunctiondelinkReversePipeTrick(s)ifs:match("^%[%[|.*[|\n]")then-- Check for newlines or multiple pipes.returnsendreturns:match("%[%[|(.*)%]%]")endlocalfunctiondelinkPipeTrick(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(":")thens=s:match("%[%[.-:(.*)|%]%]")-- If there are no colons, grab all of the text apart from the square brackets and the pipe.elses=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("(.-),.*$")endreturnsend-- Return wikilink target |wikilinks=targetlocalfunctiongetDelinkedTarget(s)localresult=s-- Deal with the reverse pipe trick.ifresult:match("%[%[|")thenreturndelinkReversePipeTrick(result)endresult=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_areaifresult:match("|")then-- Find if we're dealing with a piped link.target_area=result:match("^%[%[(.-)|.*%]%]")elsetarget_area=result:match("^%[%[(.-)%]%]")end-- Check for bad characters.ifmw.ustring.match(target_area,"[%[%]<>{}%%%c\n]")andmw.ustring.match(target_area,"[%[%]<>{}%%%c\n]")~="?"thenreturnsendreturntarget_areaendlocalfunctiongetDelinkedLabel(s)localresult=s-- Deal with the reverse pipe trick.ifresult:match("%[%[|")thenreturndelinkReversePipeTrick(result)endresult=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_areaifresult:match("|")then-- Find if we're dealing with a piped link.target_area=result:match("^%[%[(.-)|.*%]%]")elsetarget_area=result:match("^%[%[(.-)%]%]")end-- Check for bad characters.ifmw.ustring.match(target_area,"[%[%]<>{}%%%c\n]")andmw.ustring.match(target_area,"[%[%]<>{}%%%c\n]")~="?"thenreturnsend-- 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 namespaceifmw.language.isKnownLanguageTag(colon_prefix)or(nsand(ns.canonicalName=="File"orns.canonicalName=="Category"))thenreturn""end-- Remove the colon if the link is using the [[Help:Colon trick]].ifresult:match("%[%[:")thenresult="[["..result:match("%[%[:(.*%]%])")end-- Deal with links using the [[Help:Pipe trick]].ifmw.ustring.match(result,"^%[%[[^|]*|%]%]")thenreturndelinkPipeTrick(result)end-- Find the display area of the wikilinkifresult: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","")elseresult=result:match("^%[%[(.-)%]%]")endreturnresultendlocalfunctiondelinkURL(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")thenreturnsend-- 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_prefixfor_,vinipairs(valid_url_prefixes)doifmw.ustring.match(s,'^%['..v..'[^"%s].*%]')thenurl_prefix=vbreakendend-- Get display textifnoturl_prefixthenreturnsends=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")thenreturnsendreturns_decodedendlocalfunctiondelinkLinkClass(text,pattern,delinkFunction)iftype(text)~="string"thenerror("Attempt to de-link non-string input.",2)endiftype(pattern)~="string"ormw.ustring.sub(pattern,1,1)~="^"thenerror('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)endreturnresultendfunctionp._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","")endifargs.comments~="no"thentext=text:gsub("<!%-%-.-%-%->","")-- Remove html comments.endifargs.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)endifargs.urls~="no"thentext=delinkLinkClass(text,"^%[.-%]",delinkURL)-- De-link URLs.endifargs.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.endreturntextendfunctionp.delink(frame)ifnotgetArgsthengetArgs=require('Module:Arguments').getArgsendreturnp._delink(getArgs(frame,{wrappers='Template:Delink'}))endreturnp