<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://the-metatron.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ADependencyList</id>
	<title>Module:DependencyList - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://the-metatron.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ADependencyList"/>
	<link rel="alternate" type="text/html" href="http://the-metatron.com/index.php?title=Module:DependencyList&amp;action=history"/>
	<updated>2026-10-24T14:23:17Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>http://the-metatron.com/index.php?title=Module:DependencyList&amp;diff=486&amp;oldid=prev</id>
		<title>ZexisStryfe: Created page with &quot;-- &lt;nowiki&gt; local p = {} local libraryUtil = require( 'libraryUtil' ) local enum = require( 'Module:Enum' ) local yn = require( 'Module:Yesno' ) local param = require( 'Module...&quot;</title>
		<link rel="alternate" type="text/html" href="http://the-metatron.com/index.php?title=Module:DependencyList&amp;diff=486&amp;oldid=prev"/>
		<updated>2020-10-16T16:20:41Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- &amp;lt;nowiki&amp;gt; local p = {} local libraryUtil = require( &amp;#039;libraryUtil&amp;#039; ) local enum = require( &amp;#039;Module:Enum&amp;#039; ) local yn = require( &amp;#039;Module:Yesno&amp;#039; ) local param = require( &amp;#039;Module...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- &amp;lt;nowiki&amp;gt;&lt;br /&gt;
local p = {}&lt;br /&gt;
local libraryUtil = require( 'libraryUtil' )&lt;br /&gt;
local enum = require( 'Module:Enum' )&lt;br /&gt;
local yn = require( 'Module:Yesno' )&lt;br /&gt;
local param = require( 'Module:Paramtest' )&lt;br /&gt;
local dpl = require( 'Module:DPLlua' )&lt;br /&gt;
local moduleIsUsed = false&lt;br /&gt;
local MAX_DYNAMIC_REQUIRE_LIST_LENGTH = 30&lt;br /&gt;
local dynamicRequireListQueryCache = {}&lt;br /&gt;
&lt;br /&gt;
--- Used in case 'require( varName )' is found. Attempts to find a string value stored in 'varName'.&lt;br /&gt;
---@param content string    @The content of the module to look in as a string&lt;br /&gt;
---@param varName string&lt;br /&gt;
---@return string&lt;br /&gt;
local function substVarValue( content, varName )&lt;br /&gt;
    if varName:find( &amp;quot;%b''&amp;quot; ) or varName:find( '%b&amp;quot;&amp;quot;' ) then -- Look for balanced quotes&lt;br /&gt;
        return varName -- Is already a string&lt;br /&gt;
    else&lt;br /&gt;
        local res = content:match( varName .. '%s*=%s*(%b&amp;quot;&amp;quot;%s-%.*)' ) or content:match( varName .. &amp;quot;%s*=%s*(%b''%s-%.*)&amp;quot; ) or ''&lt;br /&gt;
        if res:find( '^([&amp;quot;\'])[Mm]odule:[%S]+%1' ) and not res:find( '%.%.' ) then&lt;br /&gt;
            return mw.text.trim( res )&lt;br /&gt;
        else&lt;br /&gt;
            return ''&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Used in case a construct like 'require( &amp;quot;Module:wowee/&amp;quot; .. isTheBest )' is found.&lt;br /&gt;
--- Will return a list of pages which satisfy this pattern where 'isTheBest' can take any value.&lt;br /&gt;
---@param query string&lt;br /&gt;
---@return string[]     @Sequence of strings&lt;br /&gt;
local function getDynamicRequireList( query )&lt;br /&gt;
    query = mw.text.split( query, '..', true )&lt;br /&gt;
    query = enum.map( query, function(x) return mw.text.trim(x) end )&lt;br /&gt;
    query = enum.map( query, function(x) return (x:match('^[\'\&amp;quot;]([^\'\&amp;quot;]+)[\'\&amp;quot;]$') or '%') end )&lt;br /&gt;
    query = table.concat( query )&lt;br /&gt;
    query = query:gsub( '^[Mm]odule:', '' )&lt;br /&gt;
&lt;br /&gt;
    if dynamicRequireListQueryCache[ query ] then&lt;br /&gt;
        return dynamicRequireListQueryCache[ query ]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local list = dpl.ask{&lt;br /&gt;
        namespace = 'Module',&lt;br /&gt;
        titlematch = query,&lt;br /&gt;
        nottitlematch = '%/doc|%sandbox%%|'..query..'/%',&lt;br /&gt;
        distinct = 'strict',&lt;br /&gt;
        ignorecase = true,&lt;br /&gt;
        ordermethod = 'title',&lt;br /&gt;
        count = MAX_DYNAMIC_REQUIRE_LIST_LENGTH + 1,&lt;br /&gt;
        skipthispage = 'no',&lt;br /&gt;
        allowcachedresults = true,&lt;br /&gt;
        cacheperiod = 604800 -- One week&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if #list &amp;gt; MAX_DYNAMIC_REQUIRE_LIST_LENGTH then&lt;br /&gt;
        list = { 'Module:' .. query }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    dynamicRequireListQueryCache[ query ] = list&lt;br /&gt;
&lt;br /&gt;
    return list&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a list of modules loaded and required by module 'moduleName'.&lt;br /&gt;
---@param moduleName string&lt;br /&gt;
---@return string[], string[]&lt;br /&gt;
local function getRequireList( moduleName )&lt;br /&gt;
    local content = mw.title.new( moduleName ):getContent()&lt;br /&gt;
    local requireList = {}&lt;br /&gt;
    local loadDataList = {}&lt;br /&gt;
    local usedTemplateList = {}&lt;br /&gt;
    local dynamicRequirelist = {}&lt;br /&gt;
    local dynamicLoadDataList = {}&lt;br /&gt;
&lt;br /&gt;
    assert( param.has_content( content ), string.format( '%s does not exist', moduleName ) )&lt;br /&gt;
&lt;br /&gt;
    content = content:gsub( '%-%-%[(=-)%[.-%]%1%]', '' ):gsub( '%-%-[^\n]*', '' ) -- Strip comments&lt;br /&gt;
&lt;br /&gt;
    local function dualGmatch( str, pat1, pat2 )&lt;br /&gt;
        local f1 = string.gmatch( str, pat1 )&lt;br /&gt;
        local f2 = string.gmatch( str, pat2 )&lt;br /&gt;
        return function()&lt;br /&gt;
            return f1() or f2()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for match in dualGmatch( content, 'require%s*%(([^%)]+)', 'require%s*(([&amp;quot;\'])%s*[Mm]odule:.-%2)' ) do&lt;br /&gt;
        match = mw.text.trim( match )&lt;br /&gt;
        match = substVarValue( content, match )&lt;br /&gt;
&lt;br /&gt;
        if match:find( '%.%.' ) then&lt;br /&gt;
            for _, x in ipairs( getDynamicRequireList( match ) ) do&lt;br /&gt;
                table.insert( dynamicRequirelist, x )&lt;br /&gt;
            end&lt;br /&gt;
        elseif match ~= '' then&lt;br /&gt;
            match = match:gsub( '[\&amp;quot;\']', '' ):gsub( '_', ' ' )&lt;br /&gt;
&lt;br /&gt;
            if match == 'libraryUtil' then&lt;br /&gt;
                match = 'Module:LibraryUtil'&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            table.insert( requireList, match )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for match in dualGmatch( content, 'mw%.loadData%s*%(([^%)]+)', 'mw%.loadData%s*(([&amp;quot;\'])%s*[Mm]odule:.-%2)' ) do&lt;br /&gt;
        match = mw.text.trim( match )&lt;br /&gt;
        match = substVarValue( content, match )&lt;br /&gt;
&lt;br /&gt;
        if match:find( '%.%.' ) then&lt;br /&gt;
            for _, x in ipairs( getDynamicRequireList( match ) ) do&lt;br /&gt;
                table.insert( dynamicLoadDataList, x )&lt;br /&gt;
            end&lt;br /&gt;
        elseif match ~= '' then&lt;br /&gt;
            match = match:gsub( '[\&amp;quot;\']', '' ):gsub( '_', ' ' )&lt;br /&gt;
            table.insert( loadDataList, match )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for func, match in string.gmatch( content, 'pcall%s*%(([^,]+),([^%),]+)' ) do&lt;br /&gt;
        func = mw.text.trim( func )&lt;br /&gt;
        match = mw.text.trim( match )&lt;br /&gt;
&lt;br /&gt;
        if func == 'require' then&lt;br /&gt;
            for _, x in ipairs( getDynamicRequireList( match ) ) do&lt;br /&gt;
                table.insert( dynamicRequirelist, x )&lt;br /&gt;
            end&lt;br /&gt;
        elseif func == 'mw.loadData' then&lt;br /&gt;
            for _, x in ipairs( getDynamicRequireList( match ) ) do&lt;br /&gt;
                table.insert( dynamicLoadDataList, x )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for preprocess in string.gmatch( content, ':preprocess%s*%((.-)%)' ) do&lt;br /&gt;
        for template in string.gmatch( preprocess, '{{(.-)[|}]' ) do&lt;br /&gt;
            if template ~= '' then&lt;br /&gt;
                if template:find( ':' ) then&lt;br /&gt;
                    table.insert( usedTemplateList, template )&lt;br /&gt;
                else&lt;br /&gt;
                    table.insert( usedTemplateList, 'Template:' .. template )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    dynamicRequirelist = enum.reject( dynamicRequirelist, function(x) return (enum.contains(requireList, x) or enum.contains(loadDataList, x)) end )&lt;br /&gt;
    dynamicLoadDataList = enum.reject( dynamicLoadDataList, function(x) return (enum.contains(requireList, x) or enum.contains(loadDataList, x)) end )&lt;br /&gt;
    requireList = enum.insert( requireList, dynamicRequirelist )&lt;br /&gt;
    requireList = enum.unique( requireList )&lt;br /&gt;
    loadDataList = enum.insert( loadDataList, dynamicLoadDataList )&lt;br /&gt;
    loadDataList = enum.unique( loadDataList )&lt;br /&gt;
    usedTemplateList = enum.unique( usedTemplateList )&lt;br /&gt;
    table.sort( requireList )&lt;br /&gt;
    table.sort( loadDataList )&lt;br /&gt;
    table.sort( usedTemplateList )&lt;br /&gt;
&lt;br /&gt;
    return requireList, loadDataList, usedTemplateList&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Makes the first letter of the input string upper case&lt;br /&gt;
---@param str string&lt;br /&gt;
---@return string&lt;br /&gt;
local function ucfirst( str )&lt;br /&gt;
    return str:gsub( '^.', function(c) return c:upper() end )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a list with module and function names used in all '{{#Invoke:moduleName|funcName}}' found on page 'templateName'.&lt;br /&gt;
---@param templateName string&lt;br /&gt;
---@return table&amp;lt;string, string&amp;gt;[]&lt;br /&gt;
local function getInvokeCallList( templateName )&lt;br /&gt;
    local content = mw.title.new( templateName ):getContent()&lt;br /&gt;
    local invokeList = {}&lt;br /&gt;
&lt;br /&gt;
    assert( param.has_content( content ), string.format( '%s does not exist', templateName ) )&lt;br /&gt;
&lt;br /&gt;
    for moduleName, funcName in string.gmatch( content, '{{[{|safeubt:}]-#[Ii]nvoke:([^|]+)|([^}|]+)[^}]*}}' ) do&lt;br /&gt;
        moduleName = ucfirst( moduleName )&lt;br /&gt;
        moduleName = string.format( 'Module:%s', moduleName )&lt;br /&gt;
        moduleName = moduleName:gsub( '_', ' ' )&lt;br /&gt;
        table.insert( invokeList, {moduleName=moduleName, funcName=funcName} )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    invokeList = enum.unique( invokeList, function(x) return x.moduleName..x.funcName end )&lt;br /&gt;
    table.sort( invokeList, function(x, y) return x.moduleName..x.funcName &amp;lt; y.moduleName..y.funcName end )&lt;br /&gt;
&lt;br /&gt;
    return invokeList&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param pageName string&lt;br /&gt;
---@param addCategories boolean&lt;br /&gt;
---@return string&lt;br /&gt;
local function messageBoxUnused( pageName, addCategories )&lt;br /&gt;
    local html = mw.html.create( 'div' ):addClass( 'mbox mbox-med mbox-unusedmodule' ):attr( 'role', 'presentation')&lt;br /&gt;
    html:tag( 'span' )&lt;br /&gt;
            :addClass( 'mbox-title' )&lt;br /&gt;
            :tag( 'span' )&lt;br /&gt;
                :addClass( 'mbox-icon metadata' )&lt;br /&gt;
                :wikitext( '[[File:WikimediaUI-Alert.svg|14px|link=]]' )&lt;br /&gt;
                :done()&lt;br /&gt;
            :wikitext( 'This module is unused.' )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( 'span' )&lt;br /&gt;
            :addClass( 'mbox-text' )&lt;br /&gt;
            :wikitext(&lt;br /&gt;
                string.format( 'This module is neither invoked by a template nor required/loaded by another module. If this is in error, make sure to add &amp;lt;code&amp;gt;{{[[Template:Documentation|Documentation]]}}&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;{{[[Template:No documentation|No&amp;amp;nbsp;documentation]]}}&amp;lt;/code&amp;gt; to the calling template\'s or parent\'s module documentation.', &lt;br /&gt;
                    pageName &lt;br /&gt;
                )&lt;br /&gt;
            )&lt;br /&gt;
            :wikitext( addCategories and '[[Category:Unused modules]]' or '' )&lt;br /&gt;
            :done()&lt;br /&gt;
        :done()&lt;br /&gt;
    return tostring( html )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Creates a link to [[Special:Search]] showing all pages found by getDynamicRequireList() in case it found more than MAX_DYNAMIC_REQUIRE_LIST_LENGTH pages.&lt;br /&gt;
---@param query string      @This will be in a format like 'Module:Wowee/%' or 'Module:Wowee/%/data'&lt;br /&gt;
---@return string&lt;br /&gt;
local function formatDynamicQueryLink( query )&lt;br /&gt;
    local prefix = query:match( '^([^/]+)' )&lt;br /&gt;
    local linkText = query:gsub( '%%', '&amp;amp;lt; ... &amp;amp;gt;' )&lt;br /&gt;
&lt;br /&gt;
    query = query:gsub( '^Module:',  '' )&lt;br /&gt;
&lt;br /&gt;
    query = query:gsub( '([^/]+)/?', function ( match )&lt;br /&gt;
        if match == '%' then&lt;br /&gt;
            return '\\/[^\\/]+'&lt;br /&gt;
        else&lt;br /&gt;
            return '\\/&amp;quot;' .. match .. '&amp;quot;'&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    query = query:gsub( '^\\/', '' )&lt;br /&gt;
&lt;br /&gt;
    query = string.format(&lt;br /&gt;
        'intitle:/%s%s/i -intitle:/%s\\/&amp;quot;&amp;quot;/i -intitle:doc prefix:&amp;quot;%s&amp;quot;',&lt;br /&gt;
        query,&lt;br /&gt;
        query:find( '&amp;quot;$' ) and '' or '&amp;quot;&amp;quot;',&lt;br /&gt;
        query,&lt;br /&gt;
        prefix&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    return string.format( '&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[%s %s]&amp;lt;/span&amp;gt;', tostring( mw.uri.fullUrl( 'Special:Search', { search = query } ) ), linkText )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param templateName string&lt;br /&gt;
---@param addCategories boolean&lt;br /&gt;
---@param invokeList table&amp;lt;string, string&amp;gt;[]    @This is the list returned by getInvokeCallList()&lt;br /&gt;
---@return string&lt;br /&gt;
local function formatInvokeCallList( templateName, addCategories, invokeList )&lt;br /&gt;
    local category = addCategories and '[[Category:Lua-based templates]]' or ''&lt;br /&gt;
    local res = {}&lt;br /&gt;
&lt;br /&gt;
    for _, item in ipairs( invokeList ) do&lt;br /&gt;
        table.insert( res, string.format(&lt;br /&gt;
            &amp;quot;&amp;lt;div role='note' class='hatnote'&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable'&amp;gt;&amp;lt;span class='hatnote-icon metadata'&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;'''%s''' invokes function '''%s''' in [[%s]] using [[Star Citizen:Lua|Lua]].&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
            templateName,&lt;br /&gt;
            item.funcName,&lt;br /&gt;
            item.moduleName&lt;br /&gt;
        ) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #invokeList &amp;gt; 0 then&lt;br /&gt;
        table.insert( res, category )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return table.concat( res )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param moduleName string&lt;br /&gt;
---@param addCategories boolean&lt;br /&gt;
---@param whatLinksHere string    @A list generated by a dpl of pages in the Template namespace which link to moduleName.&lt;br /&gt;
---@return string&lt;br /&gt;
local function formatInvokedByList( moduleName, addCategories, whatLinksHere )&lt;br /&gt;
    local category = addCategories and '[[Category:Template invoked modules]]' or ''&lt;br /&gt;
    local templateData = enum.map( whatLinksHere, function(x) return {templateName=x, invokeList=getInvokeCallList(x)} end )&lt;br /&gt;
    templateData = enum.filter( templateData, function(x) return enum.any( x.invokeList, function(y) return y.moduleName==moduleName end ) end )&lt;br /&gt;
&lt;br /&gt;
    if #templateData &amp;gt; 0 then&lt;br /&gt;
        moduleIsUsed = true&lt;br /&gt;
        local res = {}&lt;br /&gt;
&lt;br /&gt;
        for _, template in ipairs( templateData ) do&lt;br /&gt;
            for _, invoke in ipairs( template.invokeList ) do&lt;br /&gt;
                table.insert( res, string.format(&lt;br /&gt;
                    &amp;quot;&amp;lt;div role='note' class='hatnote'&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable'&amp;gt;&amp;lt;span class='hatnote-icon metadata'&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;'''%s's''' function '''%s''' is invoked by [[%s]].&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
                    moduleName,&lt;br /&gt;
                    invoke.funcName,&lt;br /&gt;
                    template.templateName&lt;br /&gt;
                ) )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        table.sort( res )&lt;br /&gt;
        table.insert( res, category )&lt;br /&gt;
&lt;br /&gt;
        return table.concat( res )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return ''&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param moduleName string&lt;br /&gt;
---@param addCategories boolean&lt;br /&gt;
---@param whatLinksHere string      @A list generated by a dpl of pages in the Module namespace which link to moduleName.&lt;br /&gt;
---@return string&lt;br /&gt;
local function formatRequiredByList( moduleName, addCategories, whatLinksHere )&lt;br /&gt;
    local childModuleData = enum.map( whatLinksHere, function ( title )&lt;br /&gt;
        local requireList, loadDataList = getRequireList( title )&lt;br /&gt;
        return {name=title, requireList=requireList, loadDataList=loadDataList}&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    local requiredByList = enum.map( childModuleData, function ( item )&lt;br /&gt;
        if enum.any( item.requireList, function(x) return x==moduleName end ) then&lt;br /&gt;
            if item.name:find( '%%' ) then&lt;br /&gt;
                return formatDynamicQueryLink( item.name )&lt;br /&gt;
            else&lt;br /&gt;
                return '[[' .. item.name .. ']]'&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    local loadedByList = enum.map( childModuleData, function ( item )&lt;br /&gt;
        if enum.any( item.loadDataList, function(x) return x==moduleName end ) then&lt;br /&gt;
            if item.name:find( '%%' ) then&lt;br /&gt;
                return formatDynamicQueryLink( item.name )&lt;br /&gt;
            else&lt;br /&gt;
                return '[[' .. item.name .. ']]'&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    if #requiredByList &amp;gt; 0 or #loadedByList &amp;gt; 0 then&lt;br /&gt;
        moduleIsUsed  = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local res = {}&lt;br /&gt;
&lt;br /&gt;
    for _, requiredByModuleName in ipairs( requiredByList ) do&lt;br /&gt;
        table.insert( res, string.format(&lt;br /&gt;
            &amp;quot;&amp;lt;div role='note' class='hatnote'&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable'&amp;gt;&amp;lt;span class='hatnote-icon metadata'&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;'''%s''' is required by %s.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
            moduleName,&lt;br /&gt;
            requiredByModuleName&lt;br /&gt;
        ) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #requiredByList &amp;gt; 0 then&lt;br /&gt;
        table.insert( res, (addCategories and '[[Category:Modules required by modules]]' or '') )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for _, loadedByModuleName in ipairs( loadedByList ) do&lt;br /&gt;
        table.insert( res, string.format(&lt;br /&gt;
            &amp;quot;&amp;lt;div role='note' class='hatnote'&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable'&amp;gt;&amp;lt;span class='hatnote-icon metadata'&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;'''%s''' is loaded by %s.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
            moduleName,&lt;br /&gt;
            loadedByModuleName&lt;br /&gt;
        ) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #loadedByList &amp;gt; 0 then&lt;br /&gt;
        table.insert( res, (addCategories and '[[Category:Module data]]' or '') )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return table.concat( res )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main( frame )&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    return p._main( args[1], args.category, args.isUsed )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param currentPageName string|nil&lt;br /&gt;
---@param addCategories boolean|string|nil&lt;br /&gt;
---@return string&lt;br /&gt;
function p._main( currentPageName, addCategories, isUsed )&lt;br /&gt;
    libraryUtil.checkType( 'Module:RequireList._main', 1, currentPageName, 'string', true )&lt;br /&gt;
    libraryUtil.checkTypeMulti( 'Module:RequireList._main', 2, addCategories, {'boolean', 'string', 'nil'} )&lt;br /&gt;
    libraryUtil.checkTypeMulti( 'Module:RequireList._main', 3, isUsed, {'boolean', 'string', 'nil'} )&lt;br /&gt;
&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    if param.is_empty( currentPageName ) and (&lt;br /&gt;
    ( title.nsText ~= 'Module'  and title.nsText ~= 'Template') or&lt;br /&gt;
    ( title.nsText == 'Module' and  title.text:find( '^Sandbox/' ) ) ) then&lt;br /&gt;
        return ''&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    currentPageName = param.default_to( currentPageName, title.fullText )&lt;br /&gt;
    currentPageName = string.gsub( currentPageName, '/[Dd]oc$', '' )&lt;br /&gt;
    currentPageName = string.gsub( currentPageName, '_', ' ' )&lt;br /&gt;
    currentPageName = ucfirst( currentPageName:gsub( ':(.)', function(c) return ':'..c:upper() end ) )&lt;br /&gt;
    addCategories = yn( param.default_to( addCategories, title.subpageText~='doc' ) )&lt;br /&gt;
    moduleIsUsed = yn( param.default_to( isUsed, false ) )&lt;br /&gt;
&lt;br /&gt;
    if currentPageName:find( '^Template:' ) then&lt;br /&gt;
        local invokeList = getInvokeCallList( currentPageName )&lt;br /&gt;
        return formatInvokeCallList( currentPageName, addCategories, invokeList )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local invokedByList, requiredByList = dpl.ask( {&lt;br /&gt;
        namespace = 'Template',&lt;br /&gt;
        linksto = currentPageName,&lt;br /&gt;
        distinct = 'strict',&lt;br /&gt;
        ignorecase = true,&lt;br /&gt;
        ordermethod = 'title',&lt;br /&gt;
        allowcachedresults = true,&lt;br /&gt;
        cacheperiod = 604800 -- One week&lt;br /&gt;
    }, {&lt;br /&gt;
        namespace = 'Module',&lt;br /&gt;
        linksto = currentPageName,&lt;br /&gt;
        nottitlematch = '%/doc|%sandbox%|' .. currentPageName:gsub( 'Module:', '' ),&lt;br /&gt;
        distinct = 'strict',&lt;br /&gt;
        ignorecase = true,&lt;br /&gt;
        ordermethod = 'title',&lt;br /&gt;
        allowcachedresults = true,&lt;br /&gt;
        cacheperiod = 604800 -- One week&lt;br /&gt;
    } )&lt;br /&gt;
&lt;br /&gt;
    invokedByList = formatInvokedByList( currentPageName, addCategories, invokedByList )&lt;br /&gt;
    requiredByList = formatRequiredByList( currentPageName, addCategories, requiredByList )&lt;br /&gt;
&lt;br /&gt;
    local requireList, loadDataList, usedTemplateList = getRequireList( currentPageName )&lt;br /&gt;
&lt;br /&gt;
    requireList = enum.map( requireList, function ( moduleName )&lt;br /&gt;
        if moduleName:find( '%%' ) then&lt;br /&gt;
            return formatDynamicQueryLink( moduleName )&lt;br /&gt;
        else&lt;br /&gt;
            return '[[' .. moduleName .. ']]'&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    loadDataList = enum.map( loadDataList, function ( moduleName )&lt;br /&gt;
        if moduleName:find( '%%' ) then&lt;br /&gt;
            return formatDynamicQueryLink( moduleName )&lt;br /&gt;
        else&lt;br /&gt;
            return '[[' .. moduleName .. ']]'&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    local res = {}&lt;br /&gt;
&lt;br /&gt;
    if not moduleIsUsed then&lt;br /&gt;
        table.insert( res, messageBoxUnused( currentPageName:gsub( 'Module:', '' ), addCategories ) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    table.insert( res, invokedByList )&lt;br /&gt;
&lt;br /&gt;
    for _, requiredModuleName in ipairs( requireList ) do&lt;br /&gt;
        table.insert( res, string.format(&lt;br /&gt;
            &amp;quot;&amp;lt;div role='note' class='hatnote'&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable'&amp;gt;&amp;lt;span class='hatnote-icon metadata'&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;'''%s''' requires %s.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
            currentPageName,&lt;br /&gt;
            requiredModuleName&lt;br /&gt;
        ) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #requireList &amp;gt; 0 then&lt;br /&gt;
        table.insert( res, (addCategories and '[[Category:Modules requiring modules]]' or '') )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for _, loadedModuleName in ipairs( loadDataList ) do&lt;br /&gt;
        table.insert( res, string.format(&lt;br /&gt;
            &amp;quot;&amp;lt;div role='note' class='hatnote'&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable'&amp;gt;&amp;lt;span class='hatnote-icon metadata'&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;'''%s''' loads data from %s.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
            currentPageName,&lt;br /&gt;
            loadedModuleName&lt;br /&gt;
        ) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #loadDataList &amp;gt; 0 then&lt;br /&gt;
        table.insert( res, (addCategories and '[[Category:Modules using data]]' or '') )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for _,  templateName in ipairs( usedTemplateList ) do&lt;br /&gt;
        table.insert( res, string.format(&lt;br /&gt;
            &amp;quot;&amp;lt;div role='note' class='hatnote'&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable'&amp;gt;&amp;lt;span class='hatnote-icon metadata'&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;'''%s''' transcludes  [[%s]] using &amp;lt;samp&amp;gt;frame:preprocess()&amp;lt;/samp&amp;gt;.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
            currentPageName,&lt;br /&gt;
            templateName&lt;br /&gt;
        ) )&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    table.insert( res, requiredByList )&lt;br /&gt;
&lt;br /&gt;
    return table.concat( res )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
-- &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>ZexisStryfe</name></author>
	</entry>
</feed>