Module:Sandbox/Philipnelson99

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 result end

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 result end

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 rankTable end

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] = {rank,edits,groups} end return dict end

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 pageText end return p