Module:Gadgets/sandbox: Difference between revisions
Appearance
Content deleted Content added
inline the function |
ignore any text in noinclude tags Tag: Reverted |
||
Line 2: | Line 2: | ||
p.parse = function() |
p.parse = function() |
||
local |
local frame = mw.getCurrentFrame() |
||
-- ignore text in noinclude tags |
|||
local text = frame:expandTemplate{ title = 'MediaWiki:Gadgets-definition' } |
|||
local lines = mw.text.split(text, '\n', false) |
local lines = mw.text.split(text, '\n', false) |
||
Revision as of 19:05, 21 February 2024
This is the module sandbox page for Module:Gadgets (diff). |
This Lua module is used in system messages. Changes to it can cause immediate changes to the Wikipedia user interface. To avoid major disruption, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Please discuss changes on the talk page before implementing them. |
This module can only be edited by administrators because it is transcluded onto one or more cascade-protected pages. |
Module to parse gadget definitions from MediaWiki:Gadgets-definition.
Usage
Intended for use from other modules only.
local gadgets = require('Module:Gadgets')
local gadgetRegistry = gadgets.parse()
local p = {}
p.parse = function()
local frame = mw.getCurrentFrame()
-- ignore text in noinclude tags
local text = frame:expandTemplate{ title = 'MediaWiki:Gadgets-definition' }
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")
-- rely on [[Wikipedia:GUS2Wiki]] until [[phab:T354890]] is implemented
local _, _, count = mw.title.new('Wikipedia:GUS2Wiki'):getContent():find('\n'..name..',(%S+)\n')
return tonumber(count) or -1
end
return p