mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Scribunto
synced 2024-11-27 01:30:00 +00:00
adb7b5f939
Users are reporting disappointment that using pairs on title objects doesn't let them see the fields available. It's easy enough to add a __pairs metamethod to allow pairs to work on title objects, so let's do that. The same can be done for mw.uri objects. For mw.message objects, we can easily enough change the implementation to be like mw.language objects, which doesn't have this problem. For mw.site.stats, we may as well just remove the load-on-demand feature since it will be demanded as soon as the environment is cloned for the first module. Change-Id: Ie5a3b5684b2bb6c090f9994baa03977687688929
86 lines
2.2 KiB
Lua
86 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
|
|
|
|
-- 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
|