Module:Sandbox/Philipnelson99 Explained

local p =

p.test = function (frame)--local SD = require "Module:SimpleDebug"--return SD.v ('Here is reached')r1000 = getPage("Wikipedia:List_of_Wikipedians_by_number_of_edits/1–1000")r1000string = parseString(r1000)r1000rank=convertToDict(r1000string)r2000 = getPage("Wikipedia:List_of_Wikipedians_by_number_of_edits/1001–2000")r2000string = parseString(r2000)r2000rank=convertToDict(r2000string)r3000 = getPage("Wikipedia:List_of_Wikipedians_by_number_of_edits/2001–3000")r3000string = parseString(r3000)r3000rank=convertToDict(r3000string)r4000 = getPage("Wikipedia:List_of_Wikipedians_by_number_of_edits/3001–4000")r4000string = parseString(r4000)r4000rank=convertToDict(r4000string)final = tableMerge(r1000rank,r2000rank,r3000rank,r4000rank)return "As of the last count, I have made "..final[frame.args[1]][2].." edits. And I am ranked " .. final[frame.args[1]][1] .. " on the most active list of Wikipedians on the English Wikipedia."end

function tableMerge(...) local tablesToMerge = assert(#tablesToMerge > 1, "There should be at least two tables to merge them")

local result =

for i = 1, #tablesToMerge do assert(type(tablesToMerge[i])

"table", string.format("Expected a table as function parameter %d", i)) for k, v in pairs(tablesToMerge[i]) do if type(v)

"table" then result[k] = result[k] or assert(type(result[k])

"table", string.format("Expected a table: '%s'", k)) result[k] = tableMerge(result[k], v) else result[k] = v end end end

return resultend

function split(str, delim) local result = delim = delim:gsub('([%(%)%.%%%+%-%*%?%[%^%$%]])', '%%%1') -- escape any special characters for match in (str..delim):gmatch("(.-)"..delim) do table.insert(result, match) end return resultend

function trim(s) return (s:gsub("^%s*(.-)%s*$", "%1"))end

function parseString(str)

local mys = str:match("! User groups\n(.*)|}"):sub(2) local rankTable = split(mys:sub(3),"\n|-")return rankTableend

function convertToDict(ranks)local dict = for k, v in pairs(ranks) do local rank,user,groups local entry = split(trim(v:sub(3)),"| ") if #entry

3 then groups = "None" end for j, x in pairs(entry) do if j

1 then rank = trim(x) elseif j

2 then if x:find("|") then user = trim((split(x,"|")[2]:gsub("%]",""))) else user = trim(x) end elseif j

3 then edits = trim(x) elseif j

4 then groups = trim(x) --print("User groups "..x) end end dict[user] = endreturn dictend

function getPage(pageTitle) local noError, page = pcall (mw.title.new, pageTitle) if not noError or (noError and not page) then mw.log("error in retrieving arg") return nil end local pageText = page:getContent if not pageText then mw.log("no page text") return nil end return pageTextendreturn p