Module:Link

local p = {}

--[=[ forEachLink

Parses wikilinks and returns information about them Usage: require( 'Module:Link' ).forEachLink("wikitext", function(linkInfo) end) Parameters: wikitext: String of wikitextformatted links. E.g. "Main PageMain pagedoes not exist" callback: Function that will be called on each wikilink with linkInfo as first parameter linkInfo is a table consisting of the following properties: .redir (boolean) .red (boolean) .text (String) .link (String or nil) .title (String or nil) Returns: The a table (array-like) of the results of the supplied callback or, if no callback function was supplied, a table of linkInfo tables Example: require( 'Module:Link' ).forEachLink("Main PageMain pagedoes not exist", function(li)   mw.log(li.text .. " points to " .. li.link .. " and has title " .. title) end) ]=]

function p.forEachLink(wikitext, callback) mw.log("Do not use! Will be disabled with gerrit:110983") local msg    = mw.message.newRawMessage( wikitext ) local parsed = msg:parse local matches = parsed:gmatch( '' ) local cbType = type(callback) local cbCompat= cbType == 'function' or ( cbType == 'table' and getmetatable(callback).__call ) local allLinkInfos = {} for link in matches do       local linkInfo = { redir  = not not link:find('class="mw-redirect"', 1, true), red    = not not link:find('class="new"', 1, true), text   = link:match('>(.-)'), link   = link:match('href="(.-)"'), title  = link:match('title="(.-)"') }       if linkInfo.text then if cbCompat then table.insert( allLinkInfos, callback( linkInfo ) ) else table.insert( allLinkInfos, linkInfo ) end end end return allLinkInfos end

return p