Module:Template introspection

From Xenharmonic Wiki
Revision as of 06:41, 27 October 2025 by Ganaram inukshuk (talk | contribs)
Jump to navigation Jump to search
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 (5)
Line Function Params
12 preprocess_wikitext (wikitext)
43 find_invokes (wikitext)
58 make_hatnote (invokes)
73 _template_introspection (main) (args)
95 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.make_hatnote(invokes)
	local hatnote = ""
	if #invokes == 0 then
		hatnote = "This template does not invoke any functions."
		return hatnote
	else
		hatnote = "This template invokes functions from Lua modules:"
		local calls = {}
		for _, call in ipairs(invokes) do
			table.insert(calls, string.format("function %s from [[Module:%s]]", call.func, call.module))
		end
		return string.format(":''%s %s''", hatnote, table.concat(calls, ", "))
	end
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

	-- Get template's code and preprocess
	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 and return as a hatnote
	local invokes = p.find_invokes(wikitext)
	return p.make_hatnote(invokes)
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