Module:Template introspection

Revision as of 06:29, 27 October 2025 by Ganaram inukshuk (talk | contribs)
Module documentation[view] [edit] [history] [purge]
This module should not be invoked directly; use its corresponding template instead: Template:Template introspection.
Module:Template introspection is deprecated and has no replacement. Further use of this module is not advised. This module is kept for historical purposes and should not be deleted.

Details: See Template:Dochead.

Introspection summary for Module:Template introspection 
Functions provided (4)
Line Function Params
12 preprocess_wikitext (wikitext)
43 find_invokes (wikitext)
58 _template_introspection (main) (args)
91 template_introspection (invokable) (frame)
Lua modules required (1)
Variable Module Functions used
getArgs Module:Arguments getArgs

No function descriptions were provided. The Lua code may have further information.


-- This module follows [[User:Ganaram inukshuk/Provisional style guide for Lua]]
local getArgs = require("Module:Arguments").getArgs

local p = {}

-- Inspects a template for any modules' functions being invoked.
-- TODO: write wrapper

-- Helper function: preprocess wikitext so that:
-- - Only text inside includeonly tags is captured.
-- - That captured text has normalized spacing and line breaks
function p.preprocess_wikitext(wikitext)
	if not wikitext or wikitext == "" then
		return ""
	end

	-- Gather all includeonly sections, if any exist
	local includeonly_blocks = {}
	for block in wikitext:gmatch("<includeonly>(.-)</includeonly>") do
		table.insert(includeonly_blocks, block)
	end

	local text_to_scan
	if #includeonly_blocks > 0 then
		text_to_scan = table.concat(includeonly_blocks, " ")
	else
		text_to_scan = wikitext
	end

	-- Normalize:
	-- 1. Convert all newlines to spaces
	-- 2. Collapse multiple spaces/tabs/newlines
	-- 3. Trim leading/trailing whitespace
	local normalized = text_to_scan
		:gsub("[\r\n]", " ")
		:gsub("%s+", " ")
		:match("^%s*(.-)%s*$")

	return normalized
end

-- Find all invokes in a wikitext string
function p.find_invokes(wikitext)
	if not wikitext or wikitext == "" then
		return {}
	end

	-- Capture all invocations and store them in a table
	local results = {}
	local pattern = "{{%s*#invoke%s*:%s*([^|}%c]+)%s*|%s*([^|}%c]+)"
	for module, func in wikitext:gmatch(pattern) do
		table.insert(results, { module = module, func = func })
	end
	
	return results
end

function p._template_introspection(args)
	local template_name = args["Template Name"]

	-- Get template wikitext
	local titleObj = mw.title.new(template_name)
	if not titleObj or not titleObj.exists then
		return string.format("Template '%s' does not exist.", template_name)
	end

	local wikitext = titleObj:getContent()
	wikitext = p.preprocess_wikitext(wikitext)
	
	if not wikitext then
		return string.format("Could not retrieve content for '%s'.", template_name)
	end
	
	-- Run invoke finder
	local invokes = p.find_invokes(wikitext)
	
	-- Format result for readability (or later, you could return a table)
	local out = {}
	table.insert(out, "== Invoked modules ==")
	for _, call in ipairs(invokes) do
		table.insert(out, string.format("* %s → %s", call.module, call.func))
	end
	
	if #invokes == 0 then
		table.insert(out, "No #invoke calls found.")
	end
	
	return table.concat(out, "\n")
end

function p.template_introspection(frame)
	local args = getArgs(frame) or {}
	
	-- Get template name, and strip /doc for proper display on /doc subpage
	args["Template Name"] = args["Template Name"] or mw.title.getCurrentTitle().text
	args["Template Name"] = args["Template Name"]:gsub("/doc$", "")
	
	return frame:preprocess(p._template_introspection(args))
		
end

return p