Module:User scripts table/sandbox

local p = {}

local function allcases(s) return s:gsub('([%^%$%(%)%%%.%[%]%*%+%-])', '%%%1') :gsub('%a', function(letter) return '['..letter:upper..letter:lower..']' end) end

local function getParam(content, template, parameter) if content == nil then return '' else return content:gsub('%b{}',		function(templated)			return templated:gsub('^{{%s*'..template..'%s*(|.-})}$', function(parameters) return parameters:gsub('|%s*'..allcases(parameter)..'%s*=%s*([^|}]+)', '%1') end)		end) end end

function p.main(frame) local rowsToGet = tonumber(frame.args[1]) or 200 -- use this to determine number of rows to get (default 200) local rowOffset = tonumber(frame.args[2]) or 0  -- use this offset to allow multiple calls to build larger table local source = mw.title.new('Wikipedia:User scripts/Most imported scripts'):getContent local data = {} local rows = mw.html.create local count = 0 for scriptTitle, total, active in source:gmatch('\n| %[%[([^%]]+)%]%] -\n| (%d+) -\n| (%d+)') do		count = count + 1 if count > rowOffset then local redirectTarget = mw.title.new(scriptTitle).redirectTarget if redirectTarget then local scriptTitle = redirectTarget.prefixedText end local scriptText = mw.title.new(scriptTitle):getContent -- don't include scripts that have been blanked or redirected as non-functional if not scriptText:find("mw.log.warn( 'You installed the userscript", 1, true) then				data[scriptTitle] = { total = total, active = active }				local docTitle = scriptTitle:match('(.-)%.[CJcj][Ss][Ss]?$')				local redirectTarget = mw.title.new(docTitle).redirectTarget				if redirectTarget then local docTitle = redirectTarget.prefixedText end				local name = docTitle:match('([^/:]-)$')				local author = scriptTitle:match('User:([^%/]+)')				local desc = 				local status = 				local browsers = 				local skins = 				local docText = mw.title.new(docTitle):getContent or 				if docText ~=  then					name = getParam(docText, '[Ii]nfobox user script', 'name') or getParam(docText, '[Ii]nfobox wikipedia user script', 'name') or docTitle:match('([^/:]-)$')					author = getParam(docText, '[Ii]nfobox user script', 'author') or getParam(docText, '[Ii]nfobox wikipedia user script', 'author') or script:match('User:([^%/]+)') status = getParam(docText, '[Ii]nfobox user script', 'status') or getParam(docText, '[Ii]nfobox wikipedia user script', 'status') or '' browsers = getParam(docText, '[Ii]nfobox user script', 'browsers') or getParam(docText, '[Ii]nfobox wikipedia user script', 'browsers') or '' skins = getParam(docText, '[Ii]nfobox user script', 'skins') or getParam(docText, '[Ii]nfobox wikipedia user script', 'skins') or '' desc = getParam(docText, '[Ii]nfobox user script', 'desc') or getParam(docText, '[Ii]nfobox wikipedia user script', 'desc') or mw.text.truncate(docText						--keep descriptions from template params												:gsub('^{{[Uu]|([^}]+)', '%1') --expand at top level						:gsub("%b{}", '') --remove other templates						--strip out images, files, media, categories						:gsub('%b[]', function(bracketed) return bracketed:gsub('^%[%[%s*(%a+):.-%]%]$',									function(link_prefix)										link_prefix = link_prefix:lower										if link_prefix == "image" or link_prefix == "file"										or link_prefix == "media" or link_prefix == "category" then											return ""										end -- otherwise leave it alone									end) end)						--remove spans while keeping text inside						--strip out remaining tags and the text inside						:gsub('<(%a+)[^>]+>(.-)', function(tag, contents) if tag:lower == "span" then return contents else return "" end end)						:gsub('%b<>', ) --remove any other tag markup						:gsub('__[^_]+__', ) --remove __ markups						:gsub('^=+[^=]+=+', ):gsub('\n=+[^=]+=+', ) --remove section titles						:gsub("+", "") --strip out bold and italic markup						:gsub(' ', ' ') --replace nbsp spaces with regular spaces						:gsub('^[:;%s]+', ):gsub('\n[:;%s]+', '\n') --strip indents, leading						:gsub('{|.-\n|}', ) --remove tables						:gsub('\n|[^\n]*\n', ) --remove table fragments						:gsub('%s+\n', '\n') --and trailing spaces						:gsub('(%s)%s+', '%1') --strip redundant spaces						:gsub(allcases(name)..'(%s)', ""..name.."%1")					, 600, ''):gsub('^(.+%.).+$', '%1') --truncate at end of last sentence before 600 chars .. ''					desc = mw.text.trim(desc):gsub('^(.+)%.$', '%1')..'.' --trim and add last period, if missing .. ' →' --add arrow link to full doc end local row = rows:tag('tr'):attr('id', scriptTitle):attr('style','vertical-align:top') if docText == '' then link = scriptTitle else link = docTitle end row:tag('td'):wikitext(string.format('\'\'\'%s\'\'\' \n %s ', link, name, scriptTitle, desc)) row:tag('td'):wikitext(string.format('%s', author, author)) row:tag('td'):wikitext(frame:callParserFunction('#time', 'j M Y', frame:callParserFunction('REVISIONTIMESTAMP', scriptTitle))):addClass('nowrap'):attr('style','text-align:right') row:tag('td'):wikitext(status) row:tag('td'):wikitext(skins) row:tag('td'):wikitext(browsers) row:tag('td'):wikitext(data[scriptTitle].active):attr('style','text-align:right') row:tag('td'):wikitext(data[scriptTitle].total):attr('style','text-align:right') rows:wikitext('\n') end end if count >= rowsToGet + rowOffset then break end end return rows end

return p