Module:Link
From MEpedia, a crowd-sourced encyclopedia of ME and CFS science and history
Documentation for this module may be created at Module:Link/doc
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 Page]][[Main page]][[does 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 Page]][[Main page]][[does 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( '<a.-</a>' )
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('>(.-)</a>'),
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