Jump to content

Module:STikiLeaderboard: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
fix bug for usernames containing magic characters
avoid defining ten different output functions by using a metatable; and use string.match rather than mw.ustring.match as it works for this pattern, and it is faster
Line 7: Line 7:
username = username:gsub('%p', '%%%0')
username = username:gsub('%p', '%%%0')
local r = {}
local r = {}
r.rank, r.uses, r.vand, r.agf, r.queue, r.first, r.last, r.avg, r.yest, r.last30 = mw.ustring.match(
r.rank, r.uses, r.vand, r.agf, r.queue, r.first, r.last, r.avg, r.yest, r.last30 = string.match(
lbtext,
lbtext,
'\n| align=center | (%d+) || align=left | %[%[User:' .. username .. '|' .. username
'\n| align=center | (%d+) || align=left | %[%[User:' .. username .. '|' .. username
Line 19: Line 19:
end
end


-- Expose the data values to wikitext
-- Get the username from #invoke and return the rank using findLeaderboardData().
return setmetatable({}, {
local function makeWrapper(dfield)
return function (frame)
__index = function (t, key)
return function (frame)
-- Get username, filter bad input, trim whitespace, and capitalise first letter.
local username = frame.args[1] or ''
local username = frame.args[1] or ''
username = mw.getContentLanguage():ucfirst(mw.text.trim(username))
username = mw.getContentLanguage():ucfirst(mw.text.trim(username))
if username == '' then
if username == '' then
error('No username specified')
error('No username specified')
end
return findLeaderboardData(key, username)
end
end
return findLeaderboardData(dfield, username)
end
end
})
end

return {
rank = makeWrapper('rank'),
uses = makeWrapper('uses'),
vand = makeWrapper('vand'),
agf = makeWrapper('agf'),
queue = makeWrapper('queue'),
first = makeWrapper('first'),
last = makeWrapper('last'),
avg = makeWrapper('avg'),
yest = makeWrapper('yest'),
last30 = makeWrapper('last30'),
}

Revision as of 23:46, 23 December 2015

-- Get the raw leaderboard content.
local lb = mw.title.new('Wikipedia:STiki/leaderboard')
local lbtext = (lb and lb:getContent()) or error('Could not find the leaderboard text')

-- Get a specific data value for a given username.
local function findLeaderboardData(dfield, username)
	username = username:gsub('%p', '%%%0')
    local r = {}
    r.rank, r.uses, r.vand, r.agf, r.queue, r.first, r.last, r.avg, r.yest, r.last30 = string.match(
        lbtext,
        '\n| align=center | (%d+) || align=left | %[%[User:' .. username .. '|' .. username
        .. '%]%] %(%[%[User_Talk:' .. username .. '|talk%]%] | %[%[Special:Contributions/'
        .. username .. '|contribs%]%]%) || align=right | (%d+) || align=right | ([%d%.]+)%% '
        .. '|| align=right | ([%d%.]+)%% || align=center | (%S+) || align=right '
        .. '| {{ntsh|%d+}} (%d+) days ago || align=right | {{ntsh|%d+}} (%d+) days ago || align=right '
        .. '| {{ntsh|[%d%.]+}} ([%d%.]+) edits || align=right | (%d+) || align=right | (%d+)'
    )
    return r[dfield]
end

-- Expose the data values to wikitext
return setmetatable({}, {
	__index = function (t, key)
		return function (frame)
	        local username = frame.args[1] or ''
	        username = mw.getContentLanguage():ucfirst(mw.text.trim(username))
	        if username == '' then
	            error('No username specified')
	        end
	        return findLeaderboardData(key, username)
        end
    end
})