mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Scribunto
synced 2024-11-30 11:04:17 +00:00
c58c528d28
This makes the interwiki map available to Lua modules. The code is based on the API interwiki map code in core (the appendInterwikiMap method of includes/api/ApiQuerySiteInfo.php.) Everything that the API includes is added, apart from iw_api and iw_wikiid, which I couldn't think of a use for from Lua modules. Accessing the interwiki map would be useful for modules like enwiki's Module:InterwikiTable,[1] as it would stop module writers having to duplicate the data. [1] https://en.wikipedia.org/wiki/Module:InterwikiTable Change-Id: Ie8ad2582aaf5e422824f7da51714a347bb4041d1
87 lines
2.2 KiB
Lua
87 lines
2.2 KiB
Lua
local site = {}
|
|
|
|
function site.setupInterface( info )
|
|
-- Boilerplate
|
|
site.setupInterface = nil
|
|
local php = mw_interface
|
|
mw_interface = nil
|
|
|
|
site.siteName = info.siteName
|
|
site.server = info.server
|
|
site.scriptPath = info.scriptPath
|
|
site.stylePath = info.stylePath
|
|
site.currentVersion = info.currentVersion
|
|
site.stats = info.stats
|
|
site.stats.pagesInCategory = php.pagesInCategory
|
|
site.stats.pagesInNamespace = php.pagesInNamespace
|
|
site.stats.usersInGroup = php.usersInGroup
|
|
site.interwikiMap = php.interwikiMap
|
|
|
|
-- Process namespace list into more useful tables
|
|
site.namespaces = {}
|
|
local namespacesByName = {}
|
|
site.subjectNamespaces = {}
|
|
site.talkNamespaces = {}
|
|
site.contentNamespaces = {}
|
|
for ns, data in pairs( info.namespaces ) do
|
|
data.subject = info.namespaces[data.subject]
|
|
data.talk = info.namespaces[data.talk]
|
|
data.associated = info.namespaces[data.associated]
|
|
|
|
site.namespaces[ns] = data
|
|
|
|
namespacesByName[data.name] = data
|
|
if data.canonicalName then
|
|
namespacesByName[data.canonicalName] = data
|
|
end
|
|
for i = 1, #data.aliases do
|
|
namespacesByName[data.aliases[i]] = data
|
|
end
|
|
|
|
if data.isSubject then
|
|
site.subjectNamespaces[ns] = data
|
|
end
|
|
if data.isTalk then
|
|
site.talkNamespaces[ns] = data
|
|
end
|
|
if data.isContent then
|
|
site.contentNamespaces[ns] = data
|
|
end
|
|
end
|
|
|
|
-- Set __index for namespacesByName to handle names-with-underscores
|
|
-- and non-standard case
|
|
local getNsIndex = php.getNsIndex
|
|
setmetatable( namespacesByName, {
|
|
__index = function ( t, k )
|
|
if type( k ) == 'string' then
|
|
-- Try with fixed underscores
|
|
k = string.gsub( k, '_', ' ' )
|
|
if rawget( t, k ) then
|
|
return rawget( t, k )
|
|
end
|
|
|
|
-- Ask PHP, because names are case-insensitive
|
|
local ns = getNsIndex( k )
|
|
if ns then
|
|
rawset( t, k, site.namespaces[ns] )
|
|
end
|
|
end
|
|
return rawget( t, k )
|
|
end
|
|
} )
|
|
|
|
-- Set namespacesByName as the lookup table for site.namespaces, so
|
|
-- something like site.namespaces.Wikipedia works without having
|
|
-- pairs( site.namespaces ) iterate all those names.
|
|
setmetatable( site.namespaces, { __index = namespacesByName } )
|
|
|
|
-- Register this library in the "mw" global
|
|
mw = mw or {}
|
|
mw.site = site
|
|
|
|
package.loaded['mw.site'] = site
|
|
end
|
|
|
|
return site
|