![]() |
VOOZH | about |
This module implements {{Delink}}.
-- This module de-links most wikitext. require('strict') localp={} localgetArgs localfunctiondelinkReversePipeTrick(s) ifs:match("^%[%[|.*[|\n]")then-- Check for newlines or multiple pipes. returns else returns:match("%[%[|(.*)%]%]") end end localfunctiondelinkPipeTrick(s) locallinkarea,display="","" -- 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 localfunctiondelinkWikilink(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. localtitlearea ifresult:match("|")then-- Find if we're dealing with a piped link. titlearea=result:match("^%[%[(.-)|.*%]%]") else titlearea=result:match("^%[%[(.-)%]%]") end -- Check for bad characters. ifmw.ustring.match(titlearea,"[%[%]<>{}%%%c\n]")then returns end -- Check for categories, interwikis, and files. localcolonprefix=result:match("%[%[(.-):.*%]%]")or""-- Get the text before the first colon. localns=mw.site.namespaces[colonprefix]-- see if this is a known namespace ifmw.language.isKnownLanguageTag(colonprefix) 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 fori,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 else returns_decoded end end localfunctiondelinkLinkClass(s,pattern,delinkFunction) ifnottype(s)=="string"then error("Attempt to de-link non-string input.",2) end ifnot(type(pattern)=="string"andmw.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="" whiles~=''do -- Replace text using one iteration of gsub. s=mw.ustring.gsub(s,pattern,delinkFunction,1) -- Append the left-most character to the result string. result=result..mw.ustring.sub(s,1,1) s=mw.ustring.sub(s,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 ifnot(args.comments=="no")then text=text:gsub("<!%-%-.-%-%->","")-- Remove html comments. end ifnot(args.wikilinks=="no")then text=delinkLinkClass(text,"^%[%[.-%]%]",delinkWikilink)-- De-link wikilinks. end ifnot(args.urls=="no")then text=delinkLinkClass(text,"^%[.-%]",delinkURL)-- De-link URLs. end ifnot(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=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