Jump to content

Module:Gadgets/sandbox

From Wikipedia, the free encyclopedia
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