Module:Gadgets/sandbox

local p = {}

p.parse = function()

local text = mw.title.new('MediaWiki:Gadgets-definition'):getContent()

local lines = mw.text.split(text, '\n', false)

local repo = {}

for _, line in ipairs(lines) do

if line:sub(1, 1) == '*' then

local name, options, pages = p.parse_line(line)

if name and #pages ~= 0 then

repo[name] = { options = options, pages = pages }

end

end

end

return repo

end

p.parse_line = function(def)

local pattern = "^%*%s*(.+)%s*(%b[])%s*(.-)$"

local name, opts, pageList = string.match(def, pattern)

name = mw.text.trim(name)

-- Process options string into a Lua table

local options = {}

if opts then

-- Extracting the options without square brackets and trimming spaces

opts = opts:sub(2, -2):gsub("%s+", "")

for pair in opts:gmatch("%s*([^|]+)%s*|?") do

local key, value = pair:match("%s*([^=]+)%s*=%s*([^=|]+)%s*")

if key and value then

options[key:match("%s*(.-)%s*$")] = value:match("^%s*(.-)%s*$")

else

key = pair:match("%s*(.-)%s*$")

options[key] = true

end

end

end

-- Process page list into an array

local pages = {}

if pageList then

for page in pageList:gmatch("[^|]+") do

table.insert(pages, mw.text.trim(page))

end

end

return name, options, pages

end

p.get_type = function(def)

if def.options.type == 'general' or def.options.type == 'styles' then

return def.options.type

end

if def.options.dependencies ~= nil then

return 'general'

end

for _, page in ipairs(def.pages) do

if not string.match(page, '%.css$') then

return 'general'

end

end

return 'styles'

end

p.get_usage = function(name)

-- escape name for use in pattern

name = name:gsub("[%-%.%+%[%]%(%)%$%^%%%?%*]", "%%%1"):gsub("_", " ")

-- rely on Wikipedia:GUS2Wiki until phab:T354890 is implemented

local _, _, count = mw.title.new('Wikipedia:GUS2Wiki'):getContent():find('\n'..name..',(%S+)\n')

-- get first number

count = count and mw.text.split( count, ',' )[ 1 ] or nil

return tonumber(count) or -1

end

return p