Module:Sandbox/Wnt/WikiLink

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 repeat fcnext=mw.ustring.match(fcn,"(%S+)") 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%2") text=mw.ustring.gsub(text,"^%[([^%[])","%1") text=mw.ustring.gsub(text,"([^%[])%[$","%1") text=mw.ustring.gsub(text,"([^%]])%]([^%]])","%1%2") text=mw.ustring.gsub(text,"^%]([^%]])","%1") text=mw.ustring.gsub(text,"([^%]])%]$","%1") if keepfile then text=mw.ustring.gsub(text,"%","%1") text=mw.ustring.gsub(text,"%","%1") end

-- process File: and Image: links, using alt text when available text=mw.ustring.gsub(text,"%","%1") -- case for File: where alt= text is present but not at end text=mw.ustring.gsub(text,"%","%1") -- case for Image: where alt= text is present but not at end text=mw.ustring.gsub(text,"%","%1") -- case for File: where alt= text is present at end text=mw.ustring.gsub(text,"%","%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,"","[") text=mw.ustring.gsub(text,"","]") text=mw.ustring.gsub(text,"","[[File:")               text=mw.ustring.gsub(text,"","[[Image:")                text=mw.ustring.gsub(text,"","]]")            elseif fcnext=="delink" then                text=mw.ustring.gsub(text,"%[%s*http://%S*%s+([^%]%[]+)%]","%1")            elseif fcnext=="wikiall" then                if args.space then                    text=mw.ustring.gsub(text, "([^ %p]) ", "%1#spacetoken#")                    text=mw.ustring.gsub(text,"(%S+)","%1")                    text=mw.ustring.gsub(text, "(%S)#spacetoken#(%S)", "%1 %2")                else                    text=mw.ustring.gsub(text,"(%S+)","%1")                end            elseif fcnext=="wikiline" then                text=mw.ustring.gsub(text,"([^\n]+)","%1")            elseif fcnext=="keepfile" then                keepfile=true            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        end -- if fcnext    until not fcnext    return text --- when all functions are used up (or no valid function given) return the input text straight    end 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 text=proc(text,fcn,args) if nowiki then text=" " .. text .. " " end return frame:preprocess(text) end

--- 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 ") end

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

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

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

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

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