Module:Introspection utils: Difference between revisions

Ganaram inukshuk (talk | contribs)
mNo edit summary
Ganaram inukshuk (talk | contribs)
No edit summary
 
(5 intermediate revisions by the same user not shown)
Line 3: Line 3:


-- TODO:
-- TODO:
-- - Detect whether a template invokes a specific module
-- Add support for detecting modules providing data, not just functions.
-- Address edge case of lazy-loaded modules (loaded within a function)


-- Common functions for module and template introspection.
-- Common functions for module and template introspection.
Line 82: Line 83:
end
end


-- Normalize tags and subst
-- Normalize tags
text_to_scan = text_to_scan
text_to_scan = text_to_scan
:gsub("<noinclude>.-</noinclude>", "")
:gsub("<noinclude>.-</noinclude>", "")
Line 90: Line 91:
:gsub("<onlyinclude>", "")
:gsub("<onlyinclude>", "")
:gsub("</onlyinclude>", "")
:gsub("</onlyinclude>", "")
:gsub("{{%s*safesubst:", "{{")
:gsub("{{%s*subst:", "{{")


-- Normalize:
-- Normalize subst/safesubst
text_to_scan = text_to_scan
    :gsub("{{+%s*[Ss]afesubst:", "{{")
    :gsub("{{+%s*[Ss]ubst:", "{{")
 
-- Normalize spaces
text_to_scan = text_to_scan
text_to_scan = text_to_scan
:gsub("[\r\n]", " ")
:gsub("[\r\n]", " ")
Line 324: Line 328:
return title and title.exists
return title and title.exists
end
local function normalize_module_name(name)
if not name then return "" end
-- Trim, replace spaces with underscores, remove namespace, lowercase first
-- letter
name = mw.text.trim(name)
name = name:gsub(" ", "_")
name = name:gsub("^[Mm]odule:", "")
name = name:gsub("^%a", string.lower)
return name
end
end


Line 329: Line 344:
-- of invocations, from find_invokes, and mod_name is the module name.
-- of invocations, from find_invokes, and mod_name is the module name.
function p.invocation_exists(invokes, mod_name)
function p.invocation_exists(invokes, mod_name)
-- Normalize module name
if type(invokes) ~= "table" then
local function normalize(name)
return false
if not name then return "" end
return name:gsub("_", " ").lower():gsub("^module:%s*", "")
end
end
local target_mod = normalize_module_name(mod_name)


local target_mod = normalize(mod_name)
-- Search
for _, invoke in ipairs(invokes) do
for _, invoke in ipairs(invokes) do
if normalize(invoke.module) == target_mod then
if normalize_module_name(invoke["module"]) == target_mod then
return true
return true
end
end
end
end
return false
return false
end
function p.tester()
local wikitext = p.get_and_preprocess_content("Template", "MOS intro")
local invokes = p.find_invokes(wikitext)
return p.invocation_exists(invokes, "MOS intro")
end
end


return p
return p