From Omniversalis

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

local p = {}

function proc(text,fcn,args) -- processes text sequentially according to a list of functions separated by spaces fcn
    text=text or ""
    fcn=fcn or ""
    local keepfile
        if fcnext then
            fcn=mw.ustring.gsub(fcn,fcnext,"") -- function names SHALL not contain pattern chars
            if fcnext=="dewiki" then          
                 -- protect all single [ and ] by temporarily converting to a password.  This allows links to remain inside file text while doing only a dewiki
                text=mw.ustring.gsub(text,"([^%[])%[([^%[])","%1<Module:WikiLink internal lsbracket token>%2")
                text=mw.ustring.gsub(text,"^%[([^%[])","<Module:WikiLink internal lsbracket token>%1")
                text=mw.ustring.gsub(text,"([^%[])%[$","%1<Module:WikiLink internal lsbracket token>")
                text=mw.ustring.gsub(text,"([^%]])%]([^%]])","%1<Module:WikiLink internal rsbracket token>%2")
                text=mw.ustring.gsub(text,"^%]([^%]])","<Module:WikiLink internal rsbracket token>%1")
                text=mw.ustring.gsub(text,"([^%]])%]$","%1<Module:WikiLink internal rsbracket token>")
                if keepfile then
                    text=mw.ustring.gsub(text,"%[%[%s*File:([^%[%]])%]%]","<Module:WikiLink internal filestart token>%1<Module:WikiLink internal 2rsbracket token>")
                    text=mw.ustring.gsub(text,"%[%[%s*Image:([^%[%]])%]%]","<Module:WikiLink internal imagestart token>%1<Module:WikiLink internal 2rsbracket token>")                

                 -- process File: and Image: links, using alt text when available
                text=mw.ustring.gsub(text,"%[%[File:[^%[%]]-|%s*alt=([^%[%]|]-)|[^%[%]]-%]%]","%1") -- case for File: where alt= text is present but not at end
                text=mw.ustring.gsub(text,"%[%[Image:[^%[%]]-|%s*alt=([^%[%]|]-)|[^%[%]]-%]%]","%1") -- case for Image: where alt= text is present but not at end
                text=mw.ustring.gsub(text,"%[%[File:[^%[%]]-|%s*alt=([^%[%]|]-)%]%]","%1") -- case for File: where alt= text is present at end
                text=mw.ustring.gsub(text,"%[%[Image:[^%[%]]-|%s*alt=([^%[%]|]-)%]%]","%1") -- case for Image: where alt= text is present at end
                text=mw.ustring.gsub(text,"%[%[[^%[%]]-|([^%[%]|]-)%]%]","%1") -- link, text separated by "|".  Handles case of File: when no alt= is specified, -assuming- last field is the legend
                text=mw.ustring.gsub(text,"%[%[([^%[%]|]-)%]%]","%1") -- link with no funny |s at all
                 -- deprotect all tokens
                text=mw.ustring.gsub(text,"<Module:WikiLink internal lsbracket token>","[")
                text=mw.ustring.gsub(text,"<Module:WikiLink internal rsbracket token>","]")
                text=mw.ustring.gsub(text,"<Module:WikiLink internal filestart token>","[[File:")
                text=mw.ustring.gsub(text,"<Module:WikiLink internal imagestart token>","[[Image:")
                text=mw.ustring.gsub(text,"<Module:WikiLink internal 2rsbracket token>","]]")
            elseif fcnext=="delink" then
            elseif fcnext=="wikiall" then
                if then
                    text=mw.ustring.gsub(text, "([^ %p]) ", "%1#spacetoken#")
                    text=mw.ustring.gsub(text, "(%S)#spacetoken#(%S)", "%1 %2")
            elseif fcnext=="wikiline" then
            elseif fcnext=="keepfile" then
            end -- if fcnext==etc.
            if args.external then
            	text = mw.ustring.gsub(text,"%[%[([^%[%]]*)%]%]", function(x) return "[" .. args.external .. mw.ustring.gsub(mw.text.encode(x)," ","_") .. " " .. x .. "]" end)
        end -- if fcnext
    until not fcnext
    return text --- when all functions are used up (or no valid function given) return the input text straight
function p.main(frame,fcn) -- gets the parameters and sets up to call proc
    local args=frame.args
    local parent=frame.getParent(frame)
    if parent then pargs=parent.args else pargs={} end
    local text=args.text or args[1] or pargs.text or pargs[1] or ""
    local nowiki=args.nowiki or pargs.nowiki
    fcn=(fcn or "") ..  (args["function"] or pargs["function"] or "")  
    --local page=mw.title.getCurrentTitle() --- in the long run this cheesy tactic won't fly - I should rewrite as a proper module and recommend Module:Page invocation in the #invoke instead.
    --if page then text=page.getContent(page) else return "error didn't get the page contents :(" end
    if nowiki then text="<nowiki>" .. text .. "</nowiki>" end
    return frame:preprocess(text)

 --- the function "parameter" is added to the beginning of the list of functions to be performed as specified by "function =".
function p.dewiki(frame)
    return p.main(frame,"dewiki ")

function p.delink(frame)
    return p.main(frame,"delink ")

function p.wikiall(frame)
    return p.main(frame,"wikiall ")

function p.wikiline(frame)
    return p.main(frame,"wikiline ")

function p.keepfile(frame)
    return p.main(frame,"keepfile ")

function p.keepfile_dewiki(frame)
    return p.main(frame,"keepfile dewiki")
return p