module:user scripts table

local p = {}

local function allcases(s)

return s:gsub('([%^%$%(%)%%%.%[%]%*%+%-])', '%%%1')

:gsub('%a', function(letter) return '['..letter:upper()..letter:lower()..']' 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 script, total, active in source:gmatch('\n| %[%[([^%]]+)%]%] -\n| (%d+) -\n| (%d+)') do

count = count + 1

if count > rowOffset then

local redirectTarget = mw.title.new(script).redirectTarget

if redirectTarget then script = redirectTarget.prefixedText end

local jsContent = mw.title.new(script):getContent() or ''

-- don't include scripts that have been blanked or redirected as non-functional

if not jsContent:find("mw.log.warn( 'You installed the userscript", 1, true) then

data[script] = { total = total, active = active }

local desc = script:match('(.-)%.[CJcj][Ss][Ss]?$')

local redirectTarget = mw.title.new(desc).redirectTarget

if redirectTarget then desc = redirectTarget.prefixedText end

local name = desc:match('([^/:]-)$')

local author = script:match('User:([^%/]+)')

local excerpt = mw.title.new(desc):getContent() or ''

if excerpt ~= '' then

excerpt = mw.text.truncate(excerpt

--keep descriptions from template params

--expand {{u}} at top level

--remove other templates

:gsub("%b{}", function(bracketed)

local desc_first, desc_rest = bracketed:match('|%s*[Dd][Ee][Ss][Cc][^=]+=%s*([^|])([^|]+)|')

if desc_first then

return desc_first:upper() .. desc_rest

end

local user = bracketed:find "^{{[Uu]|([^}]+)}}"

if user then

return '' .. user .. ''

end

if bracketed:find('^{{') and bracketed:find('}}$') then

return ''

end

end)

--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('(.+)\n', '%1') -- truncate at end of last paragraph before 600 chars

..' '..''

.. '' -- add an empty HTML comment so that if the excerpt ends with an unclosed comment (such as User:Steel359/Protection js), it doesn't break things

end

if not excerpt then excerpt = '' end

local row = rows:tag('tr'):attr('id', script):attr('style','vertical-align:top')

row:tag('td'):wikitext(string.format('\'\'\'%s\'\'\'', script, name, script))

row:tag('td'):wikitext(author and string.format('%s', author, author) or '')

row:tag('td'):wikitext(frame:callParserFunction('#time', 'j M Y', frame:callParserFunction('REVISIONTIMESTAMP', script))):addClass('nowrap'):attr('style','text-align:right')

row:tag('td'):wikitext(excerpt)

row:tag('td'):wikitext(data[script].active):attr('style','text-align:right')

row:tag('td'):wikitext(data[script].total):attr('style','text-align:right')

rows:wikitext('\n')

end

end

if count >= rowsToGet + rowOffset then break end

end

return rows

end

return p