<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://en.stargatewiki.noip.me/index.php?action=history&amp;feed=atom&amp;title=Module%3AFind_sources%2Fautodoc</id>
	<title>Module:Find sources/autodoc - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://en.stargatewiki.noip.me/index.php?action=history&amp;feed=atom&amp;title=Module%3AFind_sources%2Fautodoc"/>
	<link rel="alternate" type="text/html" href="https://en.stargatewiki.noip.me/index.php?title=Module:Find_sources/autodoc&amp;action=history"/>
	<updated>2026-04-04T00:33:27Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://en.stargatewiki.noip.me/index.php?title=Module:Find_sources/autodoc&amp;diff=16850&amp;oldid=prev</id>
		<title>LIMAFOX76: Created page with &quot;-- Define constants local ROOT_PAGE = &#039;Module:Find sources&#039; local TEMPLATE_LIST = ROOT_PAGE .. &#039;/templates&#039; -- template config module list local TEMPLATE_ROOT = TEMPLATE_LIST .. &#039;/&#039; -- template config module prefix local LINK_CONFIG = ROOT_PAGE .. &#039;/links&#039; -- link config module list local AUTODOC_SUFFIX = &#039;/autodoc&#039;  -- Load necessary modules. local mFindSources = require(&#039;Module:Find sources&#039;) local cfg = mw.loadData(&#039;Module:Find sources/autodoc/config&#039;)  local p = {}...&quot;</title>
		<link rel="alternate" type="text/html" href="https://en.stargatewiki.noip.me/index.php?title=Module:Find_sources/autodoc&amp;diff=16850&amp;oldid=prev"/>
		<updated>2024-06-15T09:27:07Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- Define constants local ROOT_PAGE = &amp;#039;Module:Find sources&amp;#039; local TEMPLATE_LIST = ROOT_PAGE .. &amp;#039;/templates&amp;#039; -- template config module list local TEMPLATE_ROOT = TEMPLATE_LIST .. &amp;#039;/&amp;#039; -- template config module prefix local LINK_CONFIG = ROOT_PAGE .. &amp;#039;/links&amp;#039; -- link config module list local AUTODOC_SUFFIX = &amp;#039;/autodoc&amp;#039;  -- Load necessary modules. local mFindSources = require(&amp;#039;Module:Find sources&amp;#039;) local cfg = mw.loadData(&amp;#039;Module:Find sources/autodoc/config&amp;#039;)  local p = {}...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Define constants&lt;br /&gt;
local ROOT_PAGE = &amp;#039;Module:Find sources&amp;#039;&lt;br /&gt;
local TEMPLATE_LIST = ROOT_PAGE .. &amp;#039;/templates&amp;#039; -- template config module list&lt;br /&gt;
local TEMPLATE_ROOT = TEMPLATE_LIST .. &amp;#039;/&amp;#039; -- template config module prefix&lt;br /&gt;
local LINK_CONFIG = ROOT_PAGE .. &amp;#039;/links&amp;#039; -- link config module list&lt;br /&gt;
local AUTODOC_SUFFIX = &amp;#039;/autodoc&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- Load necessary modules.&lt;br /&gt;
local mFindSources = require(&amp;#039;Module:Find sources&amp;#039;)&lt;br /&gt;
local cfg = mw.loadData(&amp;#039;Module:Find sources/autodoc/config&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function maybeLoadData(page)&lt;br /&gt;
	local success, data = pcall(mw.loadData, page)&lt;br /&gt;
	return success and data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function substituteParams(msg, ...)&lt;br /&gt;
	return mw.message.newRawMessage(msg, ...):plain()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function sortKeys(t)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k in pairs(t) do&lt;br /&gt;
		ret[#ret + 1] = k&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(ret)&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isValidLinkCfg(linkCfg)&lt;br /&gt;
	if type(linkCfg) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	for _, s in ipairs{&amp;#039;url&amp;#039;, &amp;#039;display&amp;#039;} do&lt;br /&gt;
		if type(linkCfg[s]) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, s in ipairs{&amp;#039;separator&amp;#039;} do&lt;br /&gt;
		if linkCfg[s] ~= nil and type(linkCfg[s]) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isValidLink(code)&lt;br /&gt;
	if type(code) ~= &amp;#039;string&amp;#039; or code == &amp;#039;&amp;#039; then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local links = maybeLoadData(LINK_CONFIG)&lt;br /&gt;
	local linkCfg = links[code]&lt;br /&gt;
	return isValidLinkCfg(linkCfg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isValidTemplateCfg(templateCfg)&lt;br /&gt;
	if type(templateCfg) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	for _, s in ipairs{&amp;#039;blurb&amp;#039;} do&lt;br /&gt;
		if type(templateCfg[s]) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, s in ipairs{&amp;#039;separator&amp;#039;, &amp;#039;class&amp;#039;, &amp;#039;style&amp;#039;} do&lt;br /&gt;
		if templateCfg[s] ~= nil and type(templateCfg[s]) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if templateCfg.isUsedInMainspace and templateCfg.isUsedInMainspace ~= true then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	if type(templateCfg.links) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function isValidLinkTable(t)&lt;br /&gt;
		if type(t) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
		if type(t.code) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
		if t.display and type(t.display) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if templateCfg.introLink and not isValidLinkTable(templateCfg.introLink) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	for _, t in ipairs(templateCfg.links) do&lt;br /&gt;
		if not isValidLinkTable(t) then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isValidTemplate(template)&lt;br /&gt;
	if type(template) ~= &amp;#039;string&amp;#039; or template == &amp;#039;&amp;#039; then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local templateCfg = maybeLoadData(TEMPLATE_ROOT .. template)&lt;br /&gt;
	return isValidTemplateCfg(templateCfg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isValidTemplateAutdocCfg(t)&lt;br /&gt;
	if type(t) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	for _, s in ipairs{&amp;#039;description&amp;#039;, &amp;#039;docIntro&amp;#039;} do&lt;br /&gt;
		if t[s] and type(t[s]) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if t.shortcuts and type(t.shortcuts) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
		return false&lt;br /&gt;
	elseif t.shortcuts then&lt;br /&gt;
		for _, s in ipairs(t.shortcuts) do&lt;br /&gt;
			if type(s) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
				return false&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeWikitable(headers, rows)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
&lt;br /&gt;
	-- Table start&lt;br /&gt;
	ret[#ret + 1] = &amp;#039;{| class=&amp;quot;wikitable&amp;quot;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	-- Headers&lt;br /&gt;
	ret[#ret + 1] = &amp;#039;|-&amp;#039;&lt;br /&gt;
	for i, header in ipairs(headers) do&lt;br /&gt;
		ret[#ret + 1] = &amp;#039;! scope=&amp;quot;col | &amp;#039; .. header&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Rows&lt;br /&gt;
	for i, row in ipairs(rows) do&lt;br /&gt;
		ret[#ret + 1] = &amp;#039;|-&amp;#039;&lt;br /&gt;
		for j, cell in ipairs(row) do&lt;br /&gt;
			if j == 1 then&lt;br /&gt;
				ret[#ret + 1] = &amp;#039;! scope=&amp;quot;row&amp;quot; | &amp;#039; .. cell&lt;br /&gt;
			else&lt;br /&gt;
				ret[#ret + 1] = &amp;#039;| &amp;#039; .. cell&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Table end&lt;br /&gt;
	ret[#ret + 1] = &amp;#039;|}&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	return table.concat(ret, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function grey(s)&lt;br /&gt;
	return string.format(&amp;#039;&amp;lt;span style=&amp;quot;color: gray;&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&amp;#039;, s)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function colspan(s, n)&lt;br /&gt;
	return string.format(&amp;#039;colspan=&amp;quot;%d&amp;quot; | %s&amp;#039;, n, s)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeWikitextError(msg)&lt;br /&gt;
	return string.format(&amp;#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;%s&amp;lt;/strong&amp;gt;&amp;#039;, msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeWikilink(page, display)&lt;br /&gt;
	if display then&lt;br /&gt;
		return string.format(&amp;#039;[[%s|%s]]&amp;#039;, page, display)&lt;br /&gt;
	else&lt;br /&gt;
		return string.format(&amp;#039;[[%s]]&amp;#039;, page)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.linkTable()&lt;br /&gt;
	local codes = sortKeys(require(LINK_CONFIG))&lt;br /&gt;
	local headers = {&lt;br /&gt;
		cfg[&amp;#039;link-table-code-header&amp;#039;],&lt;br /&gt;
		cfg[&amp;#039;link-table-description-header&amp;#039;],&lt;br /&gt;
		cfg[&amp;#039;link-table-example-header&amp;#039;],&lt;br /&gt;
		cfg[&amp;#039;link-table-notes-header&amp;#039;]&lt;br /&gt;
	}&lt;br /&gt;
	local rows = {}&lt;br /&gt;
	local links = maybeLoadData(LINK_CONFIG)&lt;br /&gt;
	for i, code in ipairs(codes) do&lt;br /&gt;
		if isValidLink(code) then&lt;br /&gt;
&lt;br /&gt;
			local linkData = links[code]&lt;br /&gt;
&lt;br /&gt;
			-- Make the example link.&lt;br /&gt;
			local success, link = pcall(&lt;br /&gt;
				mFindSources._renderLink,&lt;br /&gt;
				code,&lt;br /&gt;
				{cfg[&amp;#039;example-search-term&amp;#039;]}&lt;br /&gt;
			)&lt;br /&gt;
			if not success then&lt;br /&gt;
				link = makeWikitextError(link)&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			-- Build the row.&lt;br /&gt;
			local row = {&lt;br /&gt;
				code,&lt;br /&gt;
				linkData.description or grey(&amp;quot;&amp;#039;&amp;#039;No description available&amp;#039;&amp;#039;&amp;quot;),&lt;br /&gt;
				link,&lt;br /&gt;
				linkData.notes or &amp;#039;&amp;#039;,&lt;br /&gt;
			}&lt;br /&gt;
			rows[i] = row&lt;br /&gt;
		else&lt;br /&gt;
			local msg = substituteParams(cfg[&amp;#039;invalid-link-config-error&amp;#039;], code)&lt;br /&gt;
			msg = makeWikitextError(msg)&lt;br /&gt;
			msg = colspan(msg, 5)&lt;br /&gt;
			rows[i] = {msg}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return makeWikitable(headers, rows)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.templateTable()&lt;br /&gt;
	local templates = sortKeys(require(TEMPLATE_LIST))&lt;br /&gt;
	local headers = {&lt;br /&gt;
		cfg[&amp;#039;template-table-template-header&amp;#039;],&lt;br /&gt;
		cfg[&amp;#039;template-table-description-header&amp;#039;],&lt;br /&gt;
		cfg[&amp;#039;template-table-example-header&amp;#039;],&lt;br /&gt;
		cfg[&amp;#039;template-table-config-header&amp;#039;],&lt;br /&gt;
	}&lt;br /&gt;
	local rows = {}&lt;br /&gt;
	for i, template in ipairs(templates) do&lt;br /&gt;
		if isValidTemplate(template) then&lt;br /&gt;
			local configPage = TEMPLATE_ROOT .. template&lt;br /&gt;
			local autodocConfigPage = configPage .. AUTODOC_SUFFIX&lt;br /&gt;
			local templateData = maybeLoadData(autodocConfigPage)&lt;br /&gt;
			if not isValidTemplateAutdocCfg(templateData) then&lt;br /&gt;
				templateData = {}&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			-- Make the example text&lt;br /&gt;
			local success, example = pcall(&lt;br /&gt;
				mFindSources._main,&lt;br /&gt;
				template,&lt;br /&gt;
				{cfg[&amp;#039;example-search-term&amp;#039;]}&lt;br /&gt;
			)&lt;br /&gt;
			if not success then&lt;br /&gt;
				example = makeWikitextError(example)&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			-- Build the row.&lt;br /&gt;
			local row = {&lt;br /&gt;
				makeWikilink(mw.site.namespaces[10].name .. &amp;#039;:&amp;#039; .. template, template),&lt;br /&gt;
				templateData.description or grey(&amp;quot;&amp;#039;&amp;#039;No description available&amp;#039;&amp;#039;&amp;quot;),&lt;br /&gt;
				example,&lt;br /&gt;
				table.concat({&lt;br /&gt;
					makeWikilink(configPage, cfg[&amp;#039;template-table-main-config-link-display&amp;#039;]),&lt;br /&gt;
					makeWikilink(autodocConfigPage, cfg[&amp;#039;template-table-autodoc-config-link-display&amp;#039;])&lt;br /&gt;
				}, cfg[&amp;#039;table-config-separator&amp;#039;])&lt;br /&gt;
			}&lt;br /&gt;
			rows[i] = row&lt;br /&gt;
		else&lt;br /&gt;
			local msg = substituteParams(&lt;br /&gt;
				cfg[&amp;#039;invalid-template-config-error&amp;#039;],&lt;br /&gt;
				TEMPLATE_ROOT .. template&lt;br /&gt;
			)&lt;br /&gt;
			msg = makeWikitextError(msg)&lt;br /&gt;
			msg = colspan(msg, 4)&lt;br /&gt;
			rows[i] = {msg}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return makeWikitable(headers, rows)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function documentation(template)&lt;br /&gt;
	-- This function makes documentation for the template specified in&lt;br /&gt;
	-- the template parameter. The template should be without the &amp;quot;Template:&amp;quot;&lt;br /&gt;
	-- prefix.&lt;br /&gt;
&lt;br /&gt;
	-- Load necessary modules&lt;br /&gt;
	local mDocumentation = require(&amp;#039;Module:Documentation&amp;#039;)&lt;br /&gt;
	local mList = require(&amp;#039;Module:List&amp;#039;)&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
&lt;br /&gt;
	-- Load the config files&lt;br /&gt;
	local templateCfg = maybeLoadData(TEMPLATE_ROOT .. template)&lt;br /&gt;
	if not isValidTemplateCfg(templateCfg) then&lt;br /&gt;
		error(substituteParams(&lt;br /&gt;
			cfg[&amp;#039;invalid-template-name-error&amp;#039;],&lt;br /&gt;
			template,&lt;br /&gt;
			TEMPLATE_ROOT .. template&lt;br /&gt;
		))&lt;br /&gt;
	end&lt;br /&gt;
	local autodocCfg = maybeLoadData(TEMPLATE_ROOT .. template .. AUTODOC_SUFFIX)&lt;br /&gt;
	if not isValidTemplateAutdocCfg(autodocCfg) then&lt;br /&gt;
		autodocCfg = {}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Get the documentation content&lt;br /&gt;
	local content&lt;br /&gt;
	do&lt;br /&gt;
		-- Shortcuts&lt;br /&gt;
		local shortcuts&lt;br /&gt;
		if autodocCfg.shortcuts then&lt;br /&gt;
			shortcuts = frame:expandTemplate{title = &amp;#039;Template shortcut&amp;#039;, args = autodocCfg.shortcuts}&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Link descriptions&lt;br /&gt;
		local codes = {}&lt;br /&gt;
		if templateCfg.introLink then&lt;br /&gt;
			codes[#codes + 1] = templateCfg.introLink.code&lt;br /&gt;
		end&lt;br /&gt;
		for _, t in ipairs(templateCfg.links) do&lt;br /&gt;
			codes[#codes + 1] = t.code&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local links = maybeLoadData(LINK_CONFIG)&lt;br /&gt;
		for i, code in ipairs(codes) do&lt;br /&gt;
			if links[code] then&lt;br /&gt;
				codes[i] = links[code].description or code&lt;br /&gt;
			else&lt;br /&gt;
				codes[i] = code&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local linkDescriptions = mList.bulleted(codes)&lt;br /&gt;
&lt;br /&gt;
		-- Build the content.&lt;br /&gt;
		content = frame:expandTemplate{title = &amp;#039;Find sources documentation&amp;#039;, args = {&lt;br /&gt;
			template = template,&lt;br /&gt;
			shortcuts = shortcuts,&lt;br /&gt;
			docIntro = autodocCfg.docIntro,&lt;br /&gt;
			isUsedInMainspace = templateCfg.isUsedInMainspace and &amp;#039;yes&amp;#039; or nil,&lt;br /&gt;
			linkDescriptions = linkDescriptions&lt;br /&gt;
		}}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mDocumentation.main{content = content, [&amp;#039;link box&amp;#039;] = cfg[&amp;#039;end-box-blurb&amp;#039;]}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
setmetatable(p, { __index = function(t, template)&lt;br /&gt;
	return function()&lt;br /&gt;
		return documentation(template)&lt;br /&gt;
	end&lt;br /&gt;
end})&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>LIMAFOX76</name></author>
	</entry>
</feed>