<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.infinf.info/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3ADependencyList</id>
	<title>模块:DependencyList - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.infinf.info/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3ADependencyList"/>
	<link rel="alternate" type="text/html" href="https://wiki.infinf.info/index.php?title=%E6%A8%A1%E5%9D%97:DependencyList&amp;action=history"/>
	<updated>2026-04-13T19:54:01Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://wiki.infinf.info/index.php?title=%E6%A8%A1%E5%9D%97:DependencyList&amp;diff=1385&amp;oldid=prev</id>
		<title>9Yan：​创建页面，内容为“--- Based on Module:DependencyList from RuneScape Wiki --- Modified to use SMW instead of DPL --- @see https://runescape.wiki/w/Module:DependencyList  require( &#039;strict&#039; )  local p = {} local libraryUtil = require( &#039;libraryUtil&#039; ) local arr = require( &#039;Module:Array&#039; ) local yn = require( &#039;Module:Yesno&#039; ) local param = require( &#039;Module:Paramtest&#039; ) local userError = require( &#039;Module:User error&#039; ) local hatnote = require( &#039;Module:Hatnote&#039; )._hatnote local mHatlist…”</title>
		<link rel="alternate" type="text/html" href="https://wiki.infinf.info/index.php?title=%E6%A8%A1%E5%9D%97:DependencyList&amp;diff=1385&amp;oldid=prev"/>
		<updated>2025-08-02T10:09:25Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“--- Based on Module:DependencyList from RuneScape Wiki --- Modified to use SMW instead of DPL --- @see https://runescape.wiki/w/Module:DependencyList  require( &amp;#039;strict&amp;#039; )  local p = {} local libraryUtil = require( &amp;#039;libraryUtil&amp;#039; ) local arr = require( &amp;#039;Module:Array&amp;#039; ) local yn = require( &amp;#039;Module:Yesno&amp;#039; ) local param = require( &amp;#039;Module:Paramtest&amp;#039; ) local userError = require( &amp;#039;Module:User error&amp;#039; ) local hatnote = require( &amp;#039;Module:Hatnote&amp;#039; )._hatnote local mHatlist…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--- Based on Module:DependencyList from RuneScape Wiki&lt;br /&gt;
--- Modified to use SMW instead of DPL&lt;br /&gt;
--- @see https://runescape.wiki/w/Module:DependencyList&lt;br /&gt;
&lt;br /&gt;
require( &amp;#039;strict&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
local libraryUtil = require( &amp;#039;libraryUtil&amp;#039; )&lt;br /&gt;
local arr = require( &amp;#039;Module:Array&amp;#039; )&lt;br /&gt;
local yn = require( &amp;#039;Module:Yesno&amp;#039; )&lt;br /&gt;
local param = require( &amp;#039;Module:Paramtest&amp;#039; )&lt;br /&gt;
local userError = require( &amp;#039;Module:User error&amp;#039; )&lt;br /&gt;
local hatnote = require( &amp;#039;Module:Hatnote&amp;#039; )._hatnote&lt;br /&gt;
local mHatlist = require( &amp;#039;Module:Hatnote list&amp;#039; )&lt;br /&gt;
local mbox = require( &amp;#039;Module:Mbox&amp;#039; )._mbox&lt;br /&gt;
local i18n = require( &amp;#039;Module:i18n&amp;#039; ):new()&lt;br /&gt;
local TNT = require( &amp;#039;Module:Translate&amp;#039; ):new()&lt;br /&gt;
&lt;br /&gt;
local dpl -- Lazy load DPL&lt;br /&gt;
&lt;br /&gt;
-- Toggle query mode between SemanticMediaWiki (smw) and DynamicPageList3 (dpl)&lt;br /&gt;
-- For SMW, you will need the SemanticExtraSpecialProperties extension and enable the &amp;#039;Links to&amp;#039; property&lt;br /&gt;
local QUERY_MODE = &amp;#039;dpl&amp;#039;&lt;br /&gt;
local MAX_DYNAMIC_REQUIRE_LIST_LENGTH = 30&lt;br /&gt;
&lt;br /&gt;
local moduleIsUsed = false&lt;br /&gt;
local shouldAddCategories = false&lt;br /&gt;
local COLLAPSE_LIST_LENGTH_THRESHOLD = 5&lt;br /&gt;
local dynamicRequireListQueryCache = {}&lt;br /&gt;
&lt;br /&gt;
local NS_MODULE_NAME = mw.site.namespaces[828].name&lt;br /&gt;
local NS_TEMPLATE_NAME = mw.site.namespaces[10].name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- Wrapper function for Module:i18n.translate&lt;br /&gt;
---&lt;br /&gt;
--- @param key string The translation key&lt;br /&gt;
--- @return string If the key was not found, the key is returned&lt;br /&gt;
local function t( key )&lt;br /&gt;
    return i18n:translate( key )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- FIXME: This should go to somewhere else, like Module:Common&lt;br /&gt;
--- Calls TNT with the given key&lt;br /&gt;
---&lt;br /&gt;
--- @param key string The translation key&lt;br /&gt;
--- @return string If the key was not found in the .tab page, the key is returned&lt;br /&gt;
local function translate( key, ... )&lt;br /&gt;
    local success, translation = pcall( TNT.format, &amp;#039;Module:DependencyList/i18n.json&amp;#039;, key or &amp;#039;&amp;#039;, ... )&lt;br /&gt;
&lt;br /&gt;
    if not success or translation == nil then&lt;br /&gt;
        return key&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return translation&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local builtins = {&lt;br /&gt;
    [&amp;#039;libraryUtil&amp;#039;] = {&lt;br /&gt;
        link = &amp;#039;mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual#libraryUtil&amp;#039;,&lt;br /&gt;
        categories = {},&lt;br /&gt;
    },&lt;br /&gt;
    [&amp;#039;strict&amp;#039;] = {&lt;br /&gt;
        link = &amp;#039;mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual#strict&amp;#039;,&lt;br /&gt;
        categories = { t( &amp;#039;category_strict_mode_modules&amp;#039; ) },&lt;br /&gt;
    },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- Used in case &amp;#039;require( varName )&amp;#039; is found. Attempts to find a string value stored in &amp;#039;varName&amp;#039;.&lt;br /&gt;
---@param content string    The content of the module to search in&lt;br /&gt;
---@param varName string&lt;br /&gt;
---@return string&lt;br /&gt;
local function substVarValue( content, varName )&lt;br /&gt;
    local res = content:match( varName .. &amp;#039;%s*=%s*(%b&amp;quot;&amp;quot;%s-%.*)&amp;#039; ) or content:match( varName .. &amp;quot;%s*=%s*(%b&amp;#039;&amp;#039;%s-%.*)&amp;quot; ) or&lt;br /&gt;
        &amp;#039;&amp;#039;&lt;br /&gt;
    if res:find( &amp;#039;^([&amp;quot;\&amp;#039;])[Mm]odule?:[%S]+%1&amp;#039; ) and not res:find( &amp;#039;%.%.&amp;#039; ) and not res:find( &amp;#039;%%%a&amp;#039; ) then&lt;br /&gt;
        return mw.text.trim( res )&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---@param capture string&lt;br /&gt;
---@param content string    The content of the module to search in&lt;br /&gt;
---@return string&lt;br /&gt;
local function extractModuleName( capture, content )&lt;br /&gt;
    capture = capture:gsub( &amp;#039;^%(%s*(.-)%s*%)$&amp;#039;, &amp;#039;%1&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    if capture:find( &amp;#039;^([&amp;quot;\&amp;#039;]).-%1$&amp;#039; ) then     -- Check if it is already a pure string&lt;br /&gt;
        return capture&lt;br /&gt;
    elseif capture:find( &amp;#039;^[%a_][%w_]*$&amp;#039; ) then -- Check if if is a single variable&lt;br /&gt;
        return substVarValue( content, capture )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return capture&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---@param str string&lt;br /&gt;
---@return string&lt;br /&gt;
local function formatPageName( str )&lt;br /&gt;
    local name = mw.text.trim( str )&lt;br /&gt;
        :gsub( &amp;#039;^([\&amp;#039;\&amp;quot;])(.-)%1$&amp;#039;, function ( _, x ) return x end ) -- Only remove quotes at start and end of string if both are the same type&lt;br /&gt;
        :gsub( &amp;#039;_&amp;#039;, &amp;#039; &amp;#039; )&lt;br /&gt;
        :gsub( &amp;#039;^.&amp;#039;, string.upper )&lt;br /&gt;
        :gsub( &amp;#039;:.&amp;#039;, string.upper )&lt;br /&gt;
&lt;br /&gt;
    return name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---@param str string&lt;br /&gt;
---@param allowBuiltins? boolean&lt;br /&gt;
---@return string&lt;br /&gt;
local function formatModuleName( str, allowBuiltins )&lt;br /&gt;
    if allowBuiltins then&lt;br /&gt;
        local name = mw.text.trim( str )&lt;br /&gt;
            -- Only remove quotes at start and end of string if both are the same type&lt;br /&gt;
            :gsub( [[^([&amp;#039;&amp;quot;])(.-)%1$]], &amp;#039;%2&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
        if builtins[name] then&lt;br /&gt;
            return name&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local module = formatPageName( str )&lt;br /&gt;
&lt;br /&gt;
    if not string.find( module, &amp;#039;^[Mm]odule?:&amp;#039; ) then&lt;br /&gt;
        module = NS_MODULE_NAME .. &amp;#039;:&amp;#039; .. module&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return module&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function dualGmatch( str, pat1, pat2 )&lt;br /&gt;
    local f1 = string.gmatch( str, pat1 )&lt;br /&gt;
    if pat2 then&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;
    else&lt;br /&gt;
        return f1&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isDynamicPath( str )&lt;br /&gt;
    return string.find( str, &amp;#039;%.%.&amp;#039; ) or string.find( str, &amp;#039;%%%a&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- Used in case a construct like &amp;#039;require( &amp;quot;Module:wowee/&amp;quot; .. isTheBest )&amp;#039; is found.&lt;br /&gt;
--- Will return a list of pages which satisfy this pattern where &amp;#039;isTheBest&amp;#039; can take any value.&lt;br /&gt;
---@param query string&lt;br /&gt;
---@return string[]&lt;br /&gt;
local function getDynamicRequireList( query )&lt;br /&gt;
    if query:find( &amp;#039;%.%.&amp;#039; ) then&lt;br /&gt;
        query = mw.text.split( query, &amp;#039;..&amp;#039;, true )&lt;br /&gt;
        query = arr.map( query, function ( x ) return mw.text.trim( x ) end )&lt;br /&gt;
        query = arr.map( query, function ( x ) return (x:match( &amp;#039;^[\&amp;#039;\&amp;quot;](.-)[\&amp;#039;\&amp;quot;]$&amp;#039; ) or &amp;#039;%&amp;#039;) end )&lt;br /&gt;
        query = table.concat( query )&lt;br /&gt;
    else&lt;br /&gt;
        local _, _query = query:match( &amp;#039;([&amp;quot;\&amp;#039;])(.-)%1&amp;#039; )&lt;br /&gt;
        query = _query:gsub( &amp;#039;%%%a&amp;#039;, &amp;#039;%%&amp;#039; )&lt;br /&gt;
    end&lt;br /&gt;
    query = query:gsub( &amp;#039;^[Mm]odule:&amp;#039;, &amp;#039;&amp;#039; )&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 = {}&lt;br /&gt;
&lt;br /&gt;
    if QUERY_MODE == &amp;#039;smw&amp;#039; then&lt;br /&gt;
        --  TODO: Implement SMW query&lt;br /&gt;
    elseif QUERY_MODE == &amp;#039;dpl&amp;#039; then&lt;br /&gt;
        list = dpl.ask( {&lt;br /&gt;
            namespace = NS_MODULE_NAME,&lt;br /&gt;
            titlematch = query,&lt;br /&gt;
            nottitlematch = &amp;#039;%/doc|&amp;#039; .. query .. &amp;#039;/%&amp;#039;,&lt;br /&gt;
            distinct = &amp;#039;strict&amp;#039;,&lt;br /&gt;
            ignorecase = true,&lt;br /&gt;
            ordermethod = &amp;#039;title&amp;#039;,&lt;br /&gt;
            count = MAX_DYNAMIC_REQUIRE_LIST_LENGTH + 1,&lt;br /&gt;
            skipthispage = &amp;#039;no&amp;#039;,&lt;br /&gt;
            allowcachedresults = true,&lt;br /&gt;
            cacheperiod = 604800 -- One week&lt;br /&gt;
        } )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #list &amp;gt; MAX_DYNAMIC_REQUIRE_LIST_LENGTH then&lt;br /&gt;
        list = { &amp;#039;Module:&amp;#039; .. 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;
&lt;br /&gt;
--- Returns a list of modules loaded and required by module &amp;#039;moduleName&amp;#039;.&lt;br /&gt;
---@param moduleName string&lt;br /&gt;
---@param searchForUsedTemplates boolean|nil&lt;br /&gt;
---@return table&amp;lt;string, string[]&amp;gt;&lt;br /&gt;
local function getRequireList( moduleName, searchForUsedTemplates )&lt;br /&gt;
    local content = mw.title.new( moduleName ):getContent()&lt;br /&gt;
    local requireList = arr {}&lt;br /&gt;
    local loadDataList = arr {}&lt;br /&gt;
    local loadJsonDataList = arr {}&lt;br /&gt;
    local usedTemplateList = arr {}&lt;br /&gt;
    local dynamicRequirelist = arr {}&lt;br /&gt;
    local dynamicLoadDataList = arr {}&lt;br /&gt;
    local dynamicLoadJsonDataList = arr {}&lt;br /&gt;
    local extraCategories = arr {}&lt;br /&gt;
&lt;br /&gt;
    if content == nil then&lt;br /&gt;
        --assert( content ~= nil, translate( &amp;#039;message_not_exists&amp;#039;, moduleName ) )&lt;br /&gt;
        return {&lt;br /&gt;
            requireList = requireList,&lt;br /&gt;
            loadDataList = loadDataList,&lt;br /&gt;
            loadJsonDataList = loadJsonDataList,&lt;br /&gt;
            usedTemplateList = usedTemplateList,&lt;br /&gt;
            extraCategories = extraCategories&lt;br /&gt;
        }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    content = content:gsub( &amp;#039;%-%-%[(=-)%[.-%]%1%]&amp;#039;, &amp;#039;&amp;#039; ):gsub( &amp;#039;%-%-[^\n]*&amp;#039;, &amp;#039;&amp;#039; ) -- Strip comments&lt;br /&gt;
&lt;br /&gt;
    local function getList( pat1, pat2, list, dynList )&lt;br /&gt;
        for match in dualGmatch( content, pat1, pat2 ) do&lt;br /&gt;
            match = mw.text.trim( match )&lt;br /&gt;
            local name = extractModuleName( match, content )&lt;br /&gt;
&lt;br /&gt;
            if isDynamicPath( name ) then&lt;br /&gt;
                dynList:insert( getDynamicRequireList( name ), true )&lt;br /&gt;
            elseif name ~= &amp;#039;&amp;#039; then&lt;br /&gt;
                name = formatModuleName( name, true )&lt;br /&gt;
                table.insert( list, name )&lt;br /&gt;
&lt;br /&gt;
                if builtins[name] then&lt;br /&gt;
                    extraCategories = extraCategories:insert( builtins[name].categories, true )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    getList( &amp;#039;require%s*(%b())&amp;#039;, &amp;#039;require%s*(([&amp;quot;\&amp;#039;])%s*[Mm]odule:.-%2)&amp;#039;, requireList, dynamicRequirelist )&lt;br /&gt;
    getList( &amp;#039;mw%.loadData%s*(%b())&amp;#039;, &amp;#039;mw%.loadData%s*(([&amp;quot;\&amp;#039;])%s*[Mm]odule:.-%2)&amp;#039;, loadDataList, dynamicLoadDataList )&lt;br /&gt;
    getList( &amp;#039;mw%.loadJsonData%s*(%b())&amp;#039;, &amp;#039;mw%.loadJsonData%s*(([&amp;quot;\&amp;#039;])%s*[Mm]odule:.-%2)&amp;#039;, loadJsonDataList,&lt;br /&gt;
        dynamicLoadJsonDataList )&lt;br /&gt;
    getList( &amp;#039;pcall%s*%(%s*require%s*,([^%),]+)&amp;#039;, nil, requireList, dynamicRequirelist )&lt;br /&gt;
    getList( &amp;#039;pcall%s*%(%s*mw%.loadData%s*,([^%),]+)&amp;#039;, nil, loadDataList, dynamicLoadDataList )&lt;br /&gt;
    getList( &amp;#039;pcall%s*%(%s*mw%.loadJsonData%s*,([^%),]+)&amp;#039;, nil, loadJsonDataList, dynamicLoadJsonDataList )&lt;br /&gt;
&lt;br /&gt;
    if searchForUsedTemplates then&lt;br /&gt;
        for preprocess in string.gmatch( content, &amp;#039;:preprocess%s*(%b())&amp;#039; ) do&lt;br /&gt;
            local function recursiveGMatch( str, pat )&lt;br /&gt;
                local list = {}&lt;br /&gt;
                local i = 0&lt;br /&gt;
&lt;br /&gt;
                repeat&lt;br /&gt;
                    for match in string.gmatch( list[i] or str, pat ) do&lt;br /&gt;
                        table.insert( list, match )&lt;br /&gt;
                    end&lt;br /&gt;
                    i = i + 1&lt;br /&gt;
                until i &amp;gt; #list or i &amp;gt; 100&lt;br /&gt;
&lt;br /&gt;
                i = 0&lt;br /&gt;
                return function ()&lt;br /&gt;
                    i = i + 1&lt;br /&gt;
                    return list[i]&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            for template in recursiveGMatch( preprocess, &amp;#039;{(%b{})}&amp;#039; ) do&lt;br /&gt;
                local name = string.match( template, &amp;#039;{(.-)[|{}]&amp;#039; )&lt;br /&gt;
                if name ~= &amp;#039;&amp;#039; then&lt;br /&gt;
                    if name:find( &amp;#039;:&amp;#039; ) then&lt;br /&gt;
                        local ns = name:match( &amp;#039;^(.-):&amp;#039; )&lt;br /&gt;
                        if arr.contains( { &amp;#039;&amp;#039;, &amp;#039;template&amp;#039;, &amp;#039;user&amp;#039; }, ns:lower() ) then&lt;br /&gt;
                            table.insert( usedTemplateList, name )&lt;br /&gt;
                        elseif ns == ns:upper() then&lt;br /&gt;
                            table.insert( usedTemplateList, ns ) -- Probably a magic word&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        if name:match( &amp;#039;^%u+$&amp;#039; ) or name == &amp;#039;!&amp;#039; then&lt;br /&gt;
                            table.insert( usedTemplateList, name ) -- Probably a magic word&lt;br /&gt;
                        else&lt;br /&gt;
                            table.insert( usedTemplateList, &amp;#039;Template:&amp;#039; .. name )&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    requireList = requireList .. dynamicRequirelist&lt;br /&gt;
    requireList = requireList:unique()&lt;br /&gt;
    loadDataList = loadDataList .. dynamicLoadDataList&lt;br /&gt;
    loadDataList = loadDataList:unique()&lt;br /&gt;
    loadJsonDataList = loadJsonDataList .. dynamicLoadJsonDataList&lt;br /&gt;
    loadJsonDataList = loadJsonDataList:unique()&lt;br /&gt;
    usedTemplateList = usedTemplateList:unique()&lt;br /&gt;
    extraCategories = extraCategories:unique()&lt;br /&gt;
    table.sort( extraCategories )&lt;br /&gt;
&lt;br /&gt;
    return {&lt;br /&gt;
        requireList = requireList,&lt;br /&gt;
        loadDataList = loadDataList,&lt;br /&gt;
        loadJsonDataList = loadJsonDataList,&lt;br /&gt;
        usedTemplateList = usedTemplateList,&lt;br /&gt;
        extraCategories = extraCategories&lt;br /&gt;
    }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--- Returns a list with module and function names used in all &amp;#039;{{#Invoke:moduleName|funcName}}&amp;#039; found on page &amp;#039;templateName&amp;#039;.&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( content ~= nil, translate( &amp;#039;message_not_exists&amp;#039;, templateName ) )&lt;br /&gt;
&lt;br /&gt;
    for moduleName, funcName in string.gmatch( content, &amp;#039;{{[{|safeubt:}]-#[Ii]nvoke:([^|]+)|([^}|]+)[^}]*}}&amp;#039; ) do&lt;br /&gt;
        moduleName = formatModuleName( moduleName )&lt;br /&gt;
        funcName = mw.text.trim( funcName )&lt;br /&gt;
        if string.find( funcName, &amp;#039;^{{{&amp;#039; ) then&lt;br /&gt;
            funcName = funcName .. &amp;#039;}}}&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
        table.insert( invokeList, { moduleName = moduleName, funcName = funcName } )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    invokeList = arr.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;
---@return string&lt;br /&gt;
local function messageBoxUnused()&lt;br /&gt;
    local category = shouldAddCategories and &amp;#039;[[Category:&amp;#039; .. t( &amp;#039;category_unused_module&amp;#039; ) .. &amp;#039;]]&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    return mbox(&lt;br /&gt;
        translate( &amp;#039;message_unused_module_title&amp;#039; ),&lt;br /&gt;
        translate( &amp;#039;message_unused_module_desc&amp;#039; ),&lt;br /&gt;
        { icon = &amp;#039;WikimediaUI-Alert.svg&amp;#039; }&lt;br /&gt;
    ) .. category&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns the wikitext for the message template (mbox/hatnote)&lt;br /&gt;
---@param msgKey string message key in /i18n.json&lt;br /&gt;
---@param pageName string page name used for the message&lt;br /&gt;
---@param list table&lt;br /&gt;
---@param listType string type of the page list used for the message&lt;br /&gt;
---@return string&lt;br /&gt;
local function getDependencyListWikitext( msgKey, pageName, list, listType )&lt;br /&gt;
    local listLabel = string.format( &amp;#039;%d %s&amp;#039;, #list, listType )&lt;br /&gt;
    local listContent = mHatlist.andList( list, false )&lt;br /&gt;
&lt;br /&gt;
    --- Return mbox&lt;br /&gt;
    if #list &amp;gt; COLLAPSE_LIST_LENGTH_THRESHOLD then&lt;br /&gt;
        return mbox(&lt;br /&gt;
            translate( msgKey, pageName, listLabel ),&lt;br /&gt;
            listContent,&lt;br /&gt;
            { icon = &amp;#039;WikimediaUI-Code.svg&amp;#039; }&lt;br /&gt;
        )&lt;br /&gt;
        --- Return hatnote&lt;br /&gt;
    else&lt;br /&gt;
        return hatnote(&lt;br /&gt;
            translate( msgKey, pageName, listContent ),&lt;br /&gt;
            { icon = &amp;#039;WikimediaUI-Code.svg&amp;#039; }&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&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 &amp;#039;Module:Wowee/%&amp;#039; or &amp;#039;Module:Wowee/%/data&amp;#039;&lt;br /&gt;
---@return string&lt;br /&gt;
local function formatDynamicQueryLink( query )&lt;br /&gt;
    local prefix = query:match( &amp;#039;^([^/]+)&amp;#039; )&lt;br /&gt;
    local linkText = query:gsub( &amp;#039;%%&amp;#039;, &amp;#039;&amp;amp;lt; ... &amp;amp;gt;&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    query = query:gsub( &amp;#039;^Module?:&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    query = query:gsub( &amp;#039;([^/]+)/?&amp;#039;, function ( match )&lt;br /&gt;
        if match == &amp;#039;%&amp;#039; then&lt;br /&gt;
            return &amp;#039;\\/[^\\/]+&amp;#039;&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;#039;\\/&amp;quot;&amp;#039; .. match .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    query = query:gsub( &amp;#039;^\\/&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    query = string.format(&lt;br /&gt;
        &amp;#039;intitle:/%s%s/i -intitle:/%s\\/&amp;quot;&amp;quot;/i -intitle:doc prefix:&amp;quot;%s&amp;quot;&amp;#039;,&lt;br /&gt;
        query,&lt;br /&gt;
        query:find( &amp;#039;&amp;quot;$&amp;#039; ) and &amp;#039;&amp;#039; or &amp;#039;&amp;quot;&amp;quot;&amp;#039;,&lt;br /&gt;
        query,&lt;br /&gt;
        prefix&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    return string.format( &amp;#039;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[%s %s]&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
        tostring( mw.uri.fullUrl( &amp;#039;Special:Search&amp;#039;, {&lt;br /&gt;
            search = query&lt;br /&gt;
        } ) ), linkText )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Helper function to return the wikitext of the templates and categories&lt;br /&gt;
---@param currentPageName string&lt;br /&gt;
---@param pageList table|nil&lt;br /&gt;
---@param pageType string&lt;br /&gt;
---@param message string&lt;br /&gt;
---@param category string|nil&lt;br /&gt;
---@return string&lt;br /&gt;
local function formatDependencyList( currentPageName, pageList, pageType, message, category )&lt;br /&gt;
    local res = {}&lt;br /&gt;
&lt;br /&gt;
    if type( pageList ) == &amp;#039;table&amp;#039; and #pageList &amp;gt; 0 then&lt;br /&gt;
        table.sort( pageList )&lt;br /&gt;
        table.insert( res, getDependencyListWikitext( message, currentPageName, pageList, pageType ) )&lt;br /&gt;
&lt;br /&gt;
        if shouldAddCategories and category then&lt;br /&gt;
            table.insert( res, string.format( &amp;#039;[[Category:%s]]&amp;#039;, category ) )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return table.concat( res )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---@param templateName string&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, invokeList )&lt;br /&gt;
    local category = shouldAddCategories and &amp;#039;[[Category:&amp;#039; .. t( &amp;#039;category_lua_based_template&amp;#039; ) .. &amp;#039;]]&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
    local res = {}&lt;br /&gt;
&lt;br /&gt;
    for _, item in ipairs( invokeList ) do&lt;br /&gt;
        local msg = translate(&lt;br /&gt;
            &amp;#039;message_invokes_function&amp;#039;,&lt;br /&gt;
            templateName,&lt;br /&gt;
            item.funcName,&lt;br /&gt;
            item.moduleName&lt;br /&gt;
        )&lt;br /&gt;
        table.insert( res, hatnote( msg, { icon = &amp;#039;WikimediaUI-Code.svg&amp;#039; } ) )&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;
&lt;br /&gt;
---@param moduleName string&lt;br /&gt;
---@param whatLinksHere table    @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, whatLinksHere )&lt;br /&gt;
    local function lcfirst( str )&lt;br /&gt;
        return string.gsub( str, &amp;#039;^[Mm]odule?:.&amp;#039;, string.lower )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local templateData = arr.map( whatLinksHere,&lt;br /&gt;
        function ( x )&lt;br /&gt;
            return {&lt;br /&gt;
                templateName = x,&lt;br /&gt;
                invokeList = getInvokeCallList( x )&lt;br /&gt;
            }&lt;br /&gt;
        end )&lt;br /&gt;
    templateData = arr.filter( templateData, function ( x )&lt;br /&gt;
        return arr.any( x.invokeList, function ( y )&lt;br /&gt;
            return lcfirst( y.moduleName ) == lcfirst( moduleName )&lt;br /&gt;
        end )&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    local invokedByList = {}&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;
            --- NOTE: Somehow only templates aren&amp;#039;t linked properly, not sure why&lt;br /&gt;
            table.insert( invokedByList,&lt;br /&gt;
                translate( &amp;#039;message_function_invoked_by&amp;#039;, invoke.funcName, &amp;#039;[[&amp;#039; .. template.templateName .. &amp;#039;]]&amp;#039; ) )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #invokedByList &amp;gt; 0 then&lt;br /&gt;
        moduleIsUsed = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return formatDependencyList(&lt;br /&gt;
        moduleName,&lt;br /&gt;
        invokedByList,&lt;br /&gt;
        translate( &amp;#039;list_type_templates&amp;#039; ),&lt;br /&gt;
        &amp;#039;message_module_functions_invoked_by&amp;#039;,&lt;br /&gt;
        t( &amp;#039;category_template_invoked_modules&amp;#039; )&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---@param moduleName string&lt;br /&gt;
---@param whatLinksHere table      @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, whatLinksHere )&lt;br /&gt;
    local childModuleData = arr.map( whatLinksHere, function ( title )&lt;br /&gt;
        local lists = getRequireList( title )&lt;br /&gt;
        return {&lt;br /&gt;
            name = title,&lt;br /&gt;
            requireList = lists.requireList,&lt;br /&gt;
            loadDataList = lists.loadDataList .. lists.loadJsonDataList&lt;br /&gt;
        }&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    local requiredByList = arr.map( childModuleData, function ( item )&lt;br /&gt;
        if arr.any( item.requireList, function ( x ) return x:lower() == moduleName:lower() end ) then&lt;br /&gt;
            if item.name:find( &amp;#039;%%&amp;#039; ) then&lt;br /&gt;
                return formatDynamicQueryLink( item.name )&lt;br /&gt;
            else&lt;br /&gt;
                return &amp;#039;[[&amp;#039; .. item.name .. &amp;#039;]]&amp;#039;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    local loadedByList = arr.map( childModuleData, function ( item )&lt;br /&gt;
        if arr.any( item.loadDataList, function ( x ) return x:lower() == moduleName:lower() end ) then&lt;br /&gt;
            if item.name:find( &amp;#039;%%&amp;#039; ) then&lt;br /&gt;
                return formatDynamicQueryLink( item.name )&lt;br /&gt;
            else&lt;br /&gt;
                return &amp;#039;[[&amp;#039; .. item.name .. &amp;#039;]]&amp;#039;&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;
    table.insert( res,&lt;br /&gt;
        formatDependencyList(&lt;br /&gt;
            moduleName,&lt;br /&gt;
            requiredByList,&lt;br /&gt;
            translate( &amp;#039;list_type_modules&amp;#039; ),&lt;br /&gt;
            &amp;#039;message_required_by&amp;#039;,&lt;br /&gt;
            t( &amp;#039;category_modules_required_by_modules&amp;#039; )&lt;br /&gt;
        )&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    table.insert( res,&lt;br /&gt;
        formatDependencyList(&lt;br /&gt;
            moduleName,&lt;br /&gt;
            loadedByList,&lt;br /&gt;
            translate( &amp;#039;list_type_modules&amp;#039; ),&lt;br /&gt;
            &amp;#039;message_loaded_by&amp;#039;,&lt;br /&gt;
            t( &amp;#039;category_module_data&amp;#039; )&lt;br /&gt;
        )&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    return table.concat( res )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function cleanFrom( from )&lt;br /&gt;
    from = from or &amp;#039;&amp;#039;&lt;br /&gt;
    local parts = mw.text.split( from, &amp;#039;|&amp;#039;, true )&lt;br /&gt;
&lt;br /&gt;
    if #parts == 2 then&lt;br /&gt;
        local name = string.gsub( parts[1], &amp;#039;%[%[:&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
        name = string.gsub( name, &amp;#039;/[Dd]o[ck]u?&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
        return name&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---@param pageName string&lt;br /&gt;
---@return table&lt;br /&gt;
local function getWhatLinksHere( pageName, namespace, options )&lt;br /&gt;
    options = options or {}&lt;br /&gt;
    local whatLinksHere = {}&lt;br /&gt;
&lt;br /&gt;
    if QUERY_MODE == &amp;#039;smw&amp;#039; then&lt;br /&gt;
        local res = mw.smw.ask( {&lt;br /&gt;
            &amp;#039;[[Links to::&amp;#039; .. pageName .. &amp;#039;]]&amp;#039;,&lt;br /&gt;
            &amp;#039;[[&amp;#039; .. namespace .. &amp;#039;:+]]&amp;#039;,&lt;br /&gt;
            &amp;#039;sort=Links to&amp;#039;,&lt;br /&gt;
            &amp;#039;order=asc&amp;#039;,&lt;br /&gt;
            &amp;#039;mainlabel=from&amp;#039;&lt;br /&gt;
        } ) or {}&lt;br /&gt;
&lt;br /&gt;
        whatLinksHere = arr.new( arr.condenseSparse( arr.map( res, function ( link )&lt;br /&gt;
            return cleanFrom( link[&amp;#039;from&amp;#039;] )&lt;br /&gt;
        end ) ) ):unique()&lt;br /&gt;
&lt;br /&gt;
        if options.smw_reject_self then&lt;br /&gt;
            whatLinksHere = whatLinksHere:reject( { pageName } )&lt;br /&gt;
        end&lt;br /&gt;
    elseif QUERY_MODE == &amp;#039;dpl&amp;#039; then&lt;br /&gt;
        whatLinksHere = dpl.ask( {&lt;br /&gt;
            namespace = namespace,&lt;br /&gt;
            linksto = pageName,&lt;br /&gt;
            distinct = &amp;#039;strict&amp;#039;,&lt;br /&gt;
            ignorecase = true,&lt;br /&gt;
            ordermethod = &amp;#039;title&amp;#039;,&lt;br /&gt;
            allowcachedresults = true,&lt;br /&gt;
            cacheperiod = 604800 -- One week&lt;br /&gt;
        } )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return whatLinksHere&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param pageName string&lt;br /&gt;
---@return table&lt;br /&gt;
function p.getWhatTemplatesLinkHere( pageName )&lt;br /&gt;
    return getWhatLinksHere( pageName, NS_TEMPLATE_NAME )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param pageName string&lt;br /&gt;
---@return table&lt;br /&gt;
function p.getWhatModulesLinkHere( pageName )&lt;br /&gt;
    return getWhatLinksHere( pageName, NS_MODULE_NAME, { smw_reject_self = true } )&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( &amp;#039;Module:RequireList._main&amp;#039;, 1, currentPageName, &amp;#039;string&amp;#039;, true )&lt;br /&gt;
    libraryUtil.checkTypeMulti( &amp;#039;Module:RequireList._main&amp;#039;, 2, addCategories, { &amp;#039;boolean&amp;#039;, &amp;#039;string&amp;#039;, &amp;#039;nil&amp;#039; } )&lt;br /&gt;
    libraryUtil.checkTypeMulti( &amp;#039;Module:RequireList._main&amp;#039;, 3, isUsed, { &amp;#039;boolean&amp;#039;, &amp;#039;string&amp;#039;, &amp;#039;nil&amp;#039; } )&lt;br /&gt;
&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Leave early if not in module or template namespace&lt;br /&gt;
    if param.is_empty( currentPageName ) and&lt;br /&gt;
        (not arr.contains( { NS_MODULE_NAME, NS_TEMPLATE_NAME }, title.nsText )) then&lt;br /&gt;
        return &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    currentPageName = param.default_to( currentPageName, title.fullText )&lt;br /&gt;
    currentPageName = string.gsub( currentPageName, &amp;#039;/[Dd]o[ck]u?$&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
    currentPageName = formatPageName( currentPageName )&lt;br /&gt;
    moduleIsUsed = yn( param.default_to( isUsed, false ) )&lt;br /&gt;
    shouldAddCategories = yn( param.default_to( addCategories, title.subpageText ~= &amp;#039;doc&amp;#039; ) )&lt;br /&gt;
&lt;br /&gt;
    -- Don&amp;#039;t show sandbox and testcases modules as unused&lt;br /&gt;
    if title.text:lower():find( &amp;#039;sandbox&amp;#039; ) or title.text:lower():find( &amp;#039;testcases&amp;#039; ) then&lt;br /&gt;
        moduleIsUsed = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if QUERY_MODE == &amp;#039;dpl&amp;#039; then&lt;br /&gt;
        dpl = require( &amp;#039;Module:DPLlua&amp;#039; )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if currentPageName:find( &amp;#039;^&amp;#039; .. NS_TEMPLATE_NAME .. &amp;#039;:&amp;#039; ) then&lt;br /&gt;
        local ok, invokeList = pcall( getInvokeCallList, currentPageName )&lt;br /&gt;
        if ok then&lt;br /&gt;
            return formatInvokeCallList( currentPageName, invokeList )&lt;br /&gt;
        else&lt;br /&gt;
            return userError( invokeList )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local ok, lists = pcall( getRequireList, currentPageName, true )&lt;br /&gt;
    if not ok then&lt;br /&gt;
        return userError( lists )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local requireList = arr.map( lists.requireList, function ( moduleName )&lt;br /&gt;
        if moduleName:find( &amp;#039;%%&amp;#039; ) then&lt;br /&gt;
            return formatDynamicQueryLink( moduleName )&lt;br /&gt;
        elseif builtins[moduleName] then&lt;br /&gt;
            return &amp;#039;[[&amp;#039; .. builtins[moduleName].link .. &amp;#039;|&amp;#039; .. moduleName .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;#039;[[&amp;#039; .. moduleName .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    local loadDataList = arr.map( lists.loadDataList, function ( moduleName )&lt;br /&gt;
        if moduleName:find( &amp;#039;%%&amp;#039; ) then&lt;br /&gt;
            return formatDynamicQueryLink( moduleName )&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;#039;[[&amp;#039; .. moduleName .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    local loadJsonDataList = arr.map( lists.loadJsonDataList, function ( moduleName )&lt;br /&gt;
        if moduleName:find( &amp;#039;%%&amp;#039; ) then&lt;br /&gt;
            return formatDynamicQueryLink( moduleName )&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;#039;[[&amp;#039; .. moduleName .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    local usedTemplateList = arr.map( lists.usedTemplateList, function ( templateName )&lt;br /&gt;
        if string.find( templateName, &amp;#039;:&amp;#039; ) then -- Real templates are prefixed by a namespace, magic words are not&lt;br /&gt;
            return &amp;#039;[[&amp;#039; .. templateName .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;amp;#123;&amp;amp;#123;&amp;quot; ..&lt;br /&gt;
                templateName ..&lt;br /&gt;
                &amp;quot;&amp;amp;#125;&amp;amp;#125;&amp;#039;&amp;#039;&amp;#039;&amp;quot; -- Magic words don&amp;#039;t have a page so make them bold instead&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    local res = {}&lt;br /&gt;
&lt;br /&gt;
    table.insert( res, formatInvokedByList( currentPageName, p.getWhatTemplatesLinkHere( currentPageName ) ) )&lt;br /&gt;
    table.insert( res,&lt;br /&gt;
        formatDependencyList( currentPageName, requireList, translate( &amp;#039;list_type_modules&amp;#039; ), &amp;#039;message_requires&amp;#039;,&lt;br /&gt;
            t( &amp;#039;category_modules_required_by_modules&amp;#039; ) ) )&lt;br /&gt;
    table.insert( res,&lt;br /&gt;
        formatDependencyList( currentPageName, loadDataList, translate( &amp;#039;list_type_modules&amp;#039; ), &amp;#039;message_loads_data_from&amp;#039;,&lt;br /&gt;
            t( &amp;#039;category_modules_using_data&amp;#039; ) ) )&lt;br /&gt;
    table.insert( res,&lt;br /&gt;
        formatDependencyList( currentPageName, loadJsonDataList, translate( &amp;#039;list_type_modules&amp;#039; ),&lt;br /&gt;
            &amp;#039;message_loads_data_from&amp;#039;, t( &amp;#039;category_modules_using_data&amp;#039; ) ) )&lt;br /&gt;
    table.insert( res,&lt;br /&gt;
        formatDependencyList( currentPageName, usedTemplateList, translate( &amp;#039;list_type_templates&amp;#039; ),&lt;br /&gt;
            &amp;#039;message_transcludes&amp;#039;, nil ) )&lt;br /&gt;
    table.insert( res, formatRequiredByList( currentPageName, p.getWhatModulesLinkHere( currentPageName ) ) )&lt;br /&gt;
&lt;br /&gt;
    if shouldAddCategories then&lt;br /&gt;
        local extraCategories = arr.map( lists.extraCategories, function ( categoryName )&lt;br /&gt;
            return &amp;#039;[[Category:&amp;#039; .. categoryName .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        end )&lt;br /&gt;
&lt;br /&gt;
        table.insert( res, table.concat( extraCategories ) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not moduleIsUsed then&lt;br /&gt;
        table.insert( res, 1, messageBoxUnused() )&lt;br /&gt;
    end&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>9Yan</name></author>
	</entry>
</feed>