mediawiki-extensions-Scribunto/engines/LuaCommon/lualib/mw.site.lua
Brad Jorsch adb7b5f939 Make pairs() work with various library objects
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
2013-04-02 17:23:42 +00:00

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