<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://www.vigyanwiki.in/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://www.vigyanwiki.in/index.php?action=history&amp;feed=atom&amp;title=Module%3AFind_sources%2Fautodoc"/>
	<link rel="alternate" type="text/html" href="https://www.vigyanwiki.in/index.php?title=Module:Find_sources/autodoc&amp;action=history"/>
	<updated>2026-05-07T05:43:10Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://www.vigyanwiki.in/index.php?title=Module:Find_sources/autodoc&amp;diff=4535&amp;oldid=prev</id>
		<title>Admin: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://www.vigyanwiki.in/index.php?title=Module:Find_sources/autodoc&amp;diff=4535&amp;oldid=prev"/>
		<updated>2022-08-01T03:45:30Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en-GB&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 09:15, 1 August 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en-GB&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://www.vigyanwiki.in/index.php?title=Module:Find_sources/autodoc&amp;diff=4534&amp;oldid=prev</id>
		<title>wikipedia&gt;Gonnym: use proper scopes which automatically apply bold</title>
		<link rel="alternate" type="text/html" href="https://www.vigyanwiki.in/index.php?title=Module:Find_sources/autodoc&amp;diff=4534&amp;oldid=prev"/>
		<updated>2021-12-06T10:15:44Z</updated>

		<summary type="html">&lt;p&gt;use proper scopes which automatically apply bold&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 = 'Module:Find sources'&lt;br /&gt;
local TEMPLATE_LIST = ROOT_PAGE .. '/templates' -- template config module list&lt;br /&gt;
local TEMPLATE_ROOT = TEMPLATE_LIST .. '/' -- template config module prefix&lt;br /&gt;
local LINK_CONFIG = ROOT_PAGE .. '/links' -- link config module list&lt;br /&gt;
local AUTODOC_SUFFIX = '/autodoc'&lt;br /&gt;
&lt;br /&gt;
-- Load necessary modules.&lt;br /&gt;
local mFindSources = require('Module:Find sources')&lt;br /&gt;
local cfg = mw.loadData('Module:Find sources/autodoc/config')&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) ~= 'table' then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	for _, s in ipairs{'url', 'display'} do&lt;br /&gt;
		if type(linkCfg[s]) ~= 'string' then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, s in ipairs{'separator'} do&lt;br /&gt;
		if linkCfg[s] ~= nil and type(linkCfg[s]) ~= 'string' 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) ~= 'string' or code == '' 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) ~= 'table' then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	for _, s in ipairs{'blurb'} do&lt;br /&gt;
		if type(templateCfg[s]) ~= 'string' then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, s in ipairs{'separator', 'class', 'style'} do&lt;br /&gt;
		if templateCfg[s] ~= nil and type(templateCfg[s]) ~= 'string' 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) ~= 'table' 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) ~= 'table' then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
		if type(t.code) ~= 'string' then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
		if t.display and type(t.display) ~= 'string' 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) ~= 'string' or template == '' 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) ~= 'table' then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	for _, s in ipairs{'description', 'docIntro'} do&lt;br /&gt;
		if t[s] and type(t[s]) ~= 'string' then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if t.shortcuts and type(t.shortcuts) ~= 'table' 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) ~= 'string' 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] = '{| class=&amp;quot;wikitable&amp;quot;'&lt;br /&gt;
&lt;br /&gt;
	-- Headers&lt;br /&gt;
	ret[#ret + 1] = '|-'&lt;br /&gt;
	for i, header in ipairs(headers) do&lt;br /&gt;
		ret[#ret + 1] = '! scope=&amp;quot;col | ' .. 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] = '|-'&lt;br /&gt;
		for j, cell in ipairs(row) do&lt;br /&gt;
			if j == 1 then&lt;br /&gt;
				ret[#ret + 1] = '! scope=&amp;quot;row&amp;quot; | ' .. cell&lt;br /&gt;
			else&lt;br /&gt;
				ret[#ret + 1] = '| ' .. 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] = '|}'&lt;br /&gt;
&lt;br /&gt;
	return table.concat(ret, '\n')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function grey(s)&lt;br /&gt;
	return string.format('&amp;lt;span style=&amp;quot;color: gray;&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;', s)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function colspan(s, n)&lt;br /&gt;
	return string.format('colspan=&amp;quot;%d&amp;quot; | %s', n, s)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeWikitextError(msg)&lt;br /&gt;
	return string.format('&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;%s&amp;lt;/strong&amp;gt;', 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('[[%s|%s]]', page, display)&lt;br /&gt;
	else&lt;br /&gt;
		return string.format('[[%s]]', 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['link-table-code-header'],&lt;br /&gt;
		cfg['link-table-description-header'],&lt;br /&gt;
		cfg['link-table-example-header'],&lt;br /&gt;
		cfg['link-table-notes-header']&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['example-search-term']}&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;''No description available''&amp;quot;),&lt;br /&gt;
				link,&lt;br /&gt;
				linkData.notes or '',&lt;br /&gt;
			}&lt;br /&gt;
			rows[i] = row&lt;br /&gt;
		else&lt;br /&gt;
			local msg = substituteParams(cfg['invalid-link-config-error'], 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['template-table-template-header'],&lt;br /&gt;
		cfg['template-table-description-header'],&lt;br /&gt;
		cfg['template-table-example-header'],&lt;br /&gt;
		cfg['template-table-config-header'],&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['example-search-term']}&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 .. ':' .. template, template),&lt;br /&gt;
				templateData.description or grey(&amp;quot;''No description available''&amp;quot;),&lt;br /&gt;
				example,&lt;br /&gt;
				table.concat({&lt;br /&gt;
					makeWikilink(configPage, cfg['template-table-main-config-link-display']),&lt;br /&gt;
					makeWikilink(autodocConfigPage, cfg['template-table-autodoc-config-link-display'])&lt;br /&gt;
				}, cfg['table-config-separator'])&lt;br /&gt;
			}&lt;br /&gt;
			rows[i] = row&lt;br /&gt;
		else&lt;br /&gt;
			local msg = substituteParams(&lt;br /&gt;
				cfg['invalid-template-config-error'],&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('Module:Documentation')&lt;br /&gt;
	local mList = require('Module:List')&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['invalid-template-name-error'],&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 = 'Template shortcut', 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 = 'Find sources documentation', args = {&lt;br /&gt;
			template = template,&lt;br /&gt;
			shortcuts = shortcuts,&lt;br /&gt;
			docIntro = autodocCfg.docIntro,&lt;br /&gt;
			isUsedInMainspace = templateCfg.isUsedInMainspace and 'yes' 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, ['link box'] = cfg['end-box-blurb']}&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>wikipedia&gt;Gonnym</name></author>
	</entry>
</feed>