 <?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://vic3.parawikis.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AScript_docs</id>
	<title>Module:Script docs - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://vic3.parawikis.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AScript_docs"/>
	<link rel="alternate" type="text/html" href="https://vic3.parawikis.com/index.php?title=Module:Script_docs&amp;action=history"/>
	<updated>2026-05-25T16:01:33Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://vic3.parawikis.com/index.php?title=Module:Script_docs&amp;diff=8348&amp;oldid=prev</id>
		<title>天津风不是天津的风：​merge from official wiki</title>
		<link rel="alternate" type="text/html" href="https://vic3.parawikis.com/index.php?title=Module:Script_docs&amp;diff=8348&amp;oldid=prev"/>
		<updated>2026-03-03T13:43:14Z</updated>

		<summary type="html">&lt;p&gt;merge from official wiki&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local tableTools = require(&amp;#039;Module:TableTools&amp;#039;)&lt;br /&gt;
local sortedPairs = tableTools.sortedPairs&lt;br /&gt;
local uString = mw.ustring&lt;br /&gt;
local html = mw.html&lt;br /&gt;
local tConcat = table.concat&lt;br /&gt;
&lt;br /&gt;
-- standardize table style&lt;br /&gt;
local mwCollapsed = &amp;#039; mw-collapsed&amp;#039;&lt;br /&gt;
local tStart = &amp;#039;{| class=&amp;quot;wikitable sortable mw-collapsible%s&amp;quot;\n|+ style=&amp;quot;white-space:nowrap;&amp;quot; | %s%s&amp;#039; --mwCollapsed, caption, header&lt;br /&gt;
&lt;br /&gt;
local p = {};&lt;br /&gt;
local functTable = {};&lt;br /&gt;
&lt;br /&gt;
-- wrapper functions&lt;br /&gt;
function p.commonTable(frame)&lt;br /&gt;
    local args = getArgs(frame)&lt;br /&gt;
    return p._commonTable(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.effectTable(frame)&lt;br /&gt;
    local args = getArgs(frame)&lt;br /&gt;
    return p._effectTable(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.eventTargetTable(frame)&lt;br /&gt;
    local args = getArgs(frame)&lt;br /&gt;
    return p._eventTargetTable(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.triggerTable(frame)&lt;br /&gt;
    local args = getArgs(frame)&lt;br /&gt;
    return p._triggerTable(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.modTypeTable(frame)&lt;br /&gt;
    local args = getArgs(frame)&lt;br /&gt;
    return p._modTypeTable(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- utility functions&lt;br /&gt;
local rowBuilder, lister, keyBreak, preCollapse, findKey, tagSetup&lt;br /&gt;
-- creates a column for each filled row or up to the specified number of columns&lt;br /&gt;
rowBuilder = function(args)&lt;br /&gt;
    local colNum = args.colNum or #args&lt;br /&gt;
    if type(colNum) ~= &amp;#039;number&amp;#039; or colNum &amp;lt;= 0 then error(&amp;quot;Invalid number of columns&amp;quot;, 2) return end&lt;br /&gt;
    for i = 1, colNum do&lt;br /&gt;
        args[i] = args[i] or &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    if args.id then&lt;br /&gt;
        return uString.format(&amp;#039;\n|- id=&amp;quot;%s&amp;quot;\n| %s&amp;#039;, args.id, tConcat(args, &amp;#039;\n| &amp;#039;, 1, colNum))&lt;br /&gt;
    else&lt;br /&gt;
        return uString.format(&amp;quot;\n|-\n| %s&amp;quot;, tConcat(args, &amp;#039;\n| &amp;#039;, 1, colNum))&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
-- creates comma separated list of table keys&lt;br /&gt;
lister = function(t)&lt;br /&gt;
    if type(t) ~= &amp;#039;table&amp;#039; then return t end&lt;br /&gt;
    local s = &amp;#039;&amp;#039;&lt;br /&gt;
    for k, _ in sortedPairs(t) do&lt;br /&gt;
        k = keyBreak(k)&lt;br /&gt;
        s = uString.format(&amp;#039;%s%s, &amp;#039;, s, k)&lt;br /&gt;
    end&lt;br /&gt;
    s = uString.sub(s, 1, -3)&lt;br /&gt;
    --s = uString.gsub(s, &amp;#039;_&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
    return s&lt;br /&gt;
end&lt;br /&gt;
-- adds word break for long keys&lt;br /&gt;
keyBreak = function(str)&lt;br /&gt;
    if type(str) ~= &amp;#039;string&amp;#039; then return str end&lt;br /&gt;
    str = mw.text.split(str, &amp;#039;_&amp;#039;)&lt;br /&gt;
    if #str &amp;gt; 6 then&lt;br /&gt;
        --approx. 1/3 and 2/3 split&lt;br /&gt;
        str[math.ceil(#str/3+1)] = &amp;#039;&amp;lt;wbr&amp;gt;&amp;#039;..str[math.ceil(#str/3 + 1)]&lt;br /&gt;
        str[math.ceil(#str/3*2+2/3)] = &amp;#039;&amp;lt;wbr&amp;gt;&amp;#039;..str[math.ceil(#str/3*2+2/3)]&lt;br /&gt;
    elseif #str &amp;gt; 3 then&lt;br /&gt;
        --approx 1/2 split&lt;br /&gt;
        str[math.ceil(#str/2+4/#str)] = &amp;#039;&amp;lt;wbr&amp;gt;&amp;#039;..str[math.ceil(#str/2+4/#str)]&lt;br /&gt;
    end&lt;br /&gt;
    return table.concat(str, &amp;#039;_&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
-- sets a &amp;lt;pre&amp;gt; around string and collapses if more than 6 lines&lt;br /&gt;
preCollapse = function(str, count)&lt;br /&gt;
    if type(str) ~= &amp;#039;string&amp;#039; then return str end&lt;br /&gt;
&lt;br /&gt;
    str, count = uString.gsub(str, &amp;#039;\n&amp;#039;, &amp;#039;%0&amp;#039;)&lt;br /&gt;
    str = html.create(&amp;#039;pre&amp;#039;):wikitext(str)&lt;br /&gt;
    if count &amp;gt; 5 then&lt;br /&gt;
        str:addClass(&amp;#039;mw-collapsible&amp;#039;):addClass(&amp;#039;mw-collapsed&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    return tostring(str)&lt;br /&gt;
end&lt;br /&gt;
-- matches input key with table keys&lt;br /&gt;
findKey = function(key, t)&lt;br /&gt;
    if type(t) ~= &amp;#039;table&amp;#039; then return nil end &lt;br /&gt;
    for tk, _ in pairs(t) do&lt;br /&gt;
        local found = uString.match(tk, &amp;#039;^&amp;#039;..key..&amp;#039;$&amp;#039;)&lt;br /&gt;
        if found then return true end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
tagSetup = function(tags, args)&lt;br /&gt;
    for _, tag in ipairs(args) do&lt;br /&gt;
        if uString.sub(tag, 1, 1) == &amp;#039;!&amp;#039; then&lt;br /&gt;
            table.insert(tags.excludes, (uString.gsub( uString.lower(tag), &amp;#039;[ !]&amp;#039;, { [&amp;#039; &amp;#039;] = &amp;#039;_&amp;#039;, [&amp;#039;!&amp;#039;] = &amp;#039;&amp;#039; } ) ) )&lt;br /&gt;
        else&lt;br /&gt;
            table.insert(tags.includes, (uString.gsub( uString.lower(tag), &amp;#039; &amp;#039;, &amp;#039;_&amp;#039;) ) )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tags&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- main functions&lt;br /&gt;
function p._commonTable(args)&lt;br /&gt;
    local args = args or {}&lt;br /&gt;
    local tags = { includes = {}, excludes = {} }&lt;br /&gt;
    tags = tagSetup(tags, args)&lt;br /&gt;
&lt;br /&gt;
    mwCollapsed = (args.noCollapse and &amp;#039;&amp;#039;) or mwCollapsed&lt;br /&gt;
    --local tStart = &amp;#039;{| class=&amp;quot;wikitable sortable mw-collapsible&amp;#039;..mwCollapsed..&amp;#039;&amp;quot;\n|+ style=&amp;quot;white-space:nowrap;&amp;quot; | &amp;#039;&lt;br /&gt;
    local tCaption = uString.format(&amp;#039;List of %s%s&amp;#039;, ((args.caption and args.caption..&amp;#039; &amp;#039;) or &amp;#039;&amp;#039;), uString.lower(args.tType))&lt;br /&gt;
    local tHeader = uString.format(&amp;quot;\n|-\n! %s !! class=unsortable | Description !! class=unsortable | Example&amp;quot;, uString.sub(args.tType, 1, -2) )&lt;br /&gt;
    local header = uString.format(tStart, mwCollapsed, tCaption, tHeader)&lt;br /&gt;
    local docData = mw.loadData(&amp;#039;Module:Script docs/&amp;#039;..args.tType)&lt;br /&gt;
    return p.tableBuilder{ header=header, funct=args.funct, sType=args.sType, tags=tags, includeSpecial=args.includeSpecial, data=docData, cat=&amp;#039;Common&amp;#039; }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._effectTable(args)&lt;br /&gt;
    local args = args or {}&lt;br /&gt;
    mwCollapsed = (args.noCollapse and &amp;#039;&amp;#039;) or mwCollapsed&lt;br /&gt;
    --local tStart = &amp;#039;{| class=&amp;quot;wikitable sortable mw-collapsible&amp;#039;..mwCollapsed..&amp;#039;&amp;quot;\n|+ style=&amp;quot;white-space:nowrap;&amp;quot; | &amp;#039;&lt;br /&gt;
    local cType = args.cType or args.sType&lt;br /&gt;
    local tCaption = uString.format(&amp;#039;List of %s%seffects&amp;#039;, ((cType and cType..&amp;#039; &amp;#039;) or &amp;#039;&amp;#039;), ((args.funct and args.funct..&amp;#039; &amp;#039;) or &amp;#039;&amp;#039;))&lt;br /&gt;
    local tHeader = &amp;quot;\n|-\n! Effect !! class=unsortable | Description !! class=unsortable | Example&amp;quot;&lt;br /&gt;
    local header = uString.format(tStart, mwCollapsed, tCaption, tHeader)&lt;br /&gt;
    local effectData = mw.loadData(&amp;#039;Module:Script docs/Effects&amp;#039;)&lt;br /&gt;
    return p.tableBuilder{ header=header, funct=args.funct, sType=args.sType or cType, includeSpecial=args.includeSpecial, data=effectData, cat=&amp;#039;Effect&amp;#039; }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._eventTargetTable(args)&lt;br /&gt;
    local args = args or {}&lt;br /&gt;
    mwCollapsed = (args.noCollapse and &amp;#039;&amp;#039;) or mwCollapsed&lt;br /&gt;
    --local tStart = &amp;#039;{| class=&amp;quot;wikitable sortable mw-collapsible&amp;#039;..mwCollapsed..&amp;#039;&amp;quot;\n|+ style=&amp;quot;white-space:nowrap;&amp;quot; | &amp;#039;&lt;br /&gt;
    local cType = args.cType or args.sType&lt;br /&gt;
    local tCaption = uString.format(&amp;#039;List of %s%sevent targets&amp;#039;, ((args.funct and args.funct..&amp;#039; &amp;#039;) or &amp;#039;&amp;#039;), ((cType and cType..&amp;#039; &amp;#039;) or &amp;#039;&amp;#039;))&lt;br /&gt;
    local tHeader = &amp;quot;\n|-\n! Event target !! class=unsortable | Description&amp;quot;&lt;br /&gt;
    local header = uString.format(tStart, mwCollapsed, tCaption, tHeader)&lt;br /&gt;
    local eventTargetData = mw.loadData(&amp;#039;Module:Script docs/Event targets&amp;#039;)&lt;br /&gt;
    return p.tableBuilder{ header=header, funct=args.funct, sType=args.sType or cType, includeSpecial=args.includeSpecial, data=eventTargetData, cat=&amp;#039;EventTarget&amp;#039; }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._triggerTable(args)&lt;br /&gt;
    local args = args or {}&lt;br /&gt;
    mwCollapsed = (args.noCollapse and &amp;#039;&amp;#039;) or mwCollapsed&lt;br /&gt;
    --local tStart = &amp;#039;{| class=&amp;quot;wikitable sortable mw-collapsible&amp;#039;..mwCollapsed..&amp;#039;&amp;quot;\n|+ style=&amp;quot;white-space:nowrap;&amp;quot; | &amp;#039;&lt;br /&gt;
    local cType = args.cType or args.sType&lt;br /&gt;
    local tCaption = uString.format(&amp;#039;List of %s%striggers&amp;#039;, ((cType and cType..&amp;#039; &amp;#039;) or &amp;#039;&amp;#039;), ((args.funct and args.funct..&amp;#039; &amp;#039;) or &amp;#039;&amp;#039;))&lt;br /&gt;
    local tHeader = &amp;quot;\n|-\n! Trigger !! class=unsortable | Description !! class=unsortable | Example&amp;quot;&lt;br /&gt;
    local header = uString.format(tStart, mwCollapsed, tCaption, tHeader)&lt;br /&gt;
    local triggerData = mw.loadData(&amp;#039;Module:Script docs/Triggers&amp;#039;)&lt;br /&gt;
    return p.tableBuilder{ header=header, funct=args.funct, sType=args.sType or cType, includeSpecial=args.includeSpecial, data=triggerData, cat=&amp;#039;Trigger&amp;#039; }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._modTypeTable(args)&lt;br /&gt;
    local args = args or {}&lt;br /&gt;
    mwCollapsed = (args.noCollapse and &amp;#039;&amp;#039;) or mwCollapsed&lt;br /&gt;
    --local tStart = &amp;#039;{| class=&amp;quot;wikitable sortable mw-collapsible&amp;#039;..mwCollapsed..&amp;#039;&amp;quot;\n|+ style=&amp;quot;white-space:nowrap;&amp;quot; | &amp;#039;&lt;br /&gt;
    local cType = args.cType or args.sType&lt;br /&gt;
    local tCaption = uString.format(&amp;#039;List of %s%smodifier types&amp;#039;, ((args.funct and args.funct..&amp;#039; &amp;#039;) or &amp;#039;&amp;#039;), ((cType and cType..&amp;#039; &amp;#039;) or &amp;#039;&amp;#039;))&lt;br /&gt;
    local tHeader = &amp;quot;\n|-\n! Modifier type&amp;quot;&lt;br /&gt;
    local header = uString.format(tStart, mwCollapsed, tCaption, tHeader)&lt;br /&gt;
    local modTypes = {&lt;br /&gt;
        battle = true, building = true, building_group = true,&lt;br /&gt;
        character = true, country = true,&lt;br /&gt;
        goods = true, interest_group = true,&lt;br /&gt;
        market = true, military_formation = true,&lt;br /&gt;
        political_movement = true, power_bloc = true,&lt;br /&gt;
        state = true, tariff = true,&lt;br /&gt;
        tax = true, unit = true,&lt;br /&gt;
    }&lt;br /&gt;
    local modSuf = { add = &amp;#039;additive&amp;#039;, mult = &amp;#039;multiplicative&amp;#039;, bool = &amp;#039;boolean&amp;#039; }&lt;br /&gt;
    return p.tableBuilder{ header=header, funct=args.funct, sType=args.sType or cType, modTypes=modTypes, modSuf=modSuf, cat=&amp;#039;ModType&amp;#039; }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.tableBuilder(args)&lt;br /&gt;
    local args = args or {}&lt;br /&gt;
    local funct = uString.lower(args.funct or &amp;#039;regular&amp;#039;)&lt;br /&gt;
    local sType = uString.gsub(uString.lower(args.sType or &amp;#039;.+&amp;#039;), &amp;#039; &amp;#039;, &amp;#039;_&amp;#039;)&lt;br /&gt;
    local lang = mw.getContentLanguage()&lt;br /&gt;
&lt;br /&gt;
    if not functTable[funct..args.cat] then&lt;br /&gt;
        return &amp;#039;&amp;lt;span style=&amp;quot;color:red; font-size:11px;&amp;quot;&amp;gt;(unrecognized script category &amp;quot;&amp;#039; .. funct .. &amp;#039;&amp;quot; for [[Module:Script docs]])&amp;lt;/span&amp;gt;[[Category:Pages with script doc errors]]&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    return args.header .. functTable[funct..args.cat](sType, args) .. &amp;#039;\n|}&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- table type functions&lt;br /&gt;
function functTable.regularCommon(sType, args)&lt;br /&gt;
    local tags, t, num = args.tags, {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | Scopes !! style=&amp;quot;width:0px;&amp;quot; | Targets&amp;#039;&lt;br /&gt;
    if #tags.includes == 0 then tags.includes[1] = &amp;#039;.+&amp;#039; end&lt;br /&gt;
    if #tags.excludes == 0 then tags.excludes[1] = &amp;#039;&amp;#039; end&lt;br /&gt;
    local include, exclude, id&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        include = false&lt;br /&gt;
        exclude = false&lt;br /&gt;
        for i, j in ipairs(tags.includes) do&lt;br /&gt;
            include = findKey(j, val.tags)&lt;br /&gt;
            if not include then break end&lt;br /&gt;
        end&lt;br /&gt;
        for _, j in ipairs(tags.excludes) do&lt;br /&gt;
            exclude = findKey(j, val.tags)&lt;br /&gt;
            if exclude then break end          &lt;br /&gt;
        end&lt;br /&gt;
        if (include and (not exclude)) and (findKey(sType, val.scopes) or findKey(sType, val.targets)) then&lt;br /&gt;
            id = key&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{id=id, key, val.description, preCollapse(val.example), lister(val.scopes), lister(val.targets), colNum=5}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.debugCommon(sType, args)&lt;br /&gt;
    local tags, t, num = args.tags, {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | Scopes !! style=&amp;quot;width:0px;&amp;quot; | Targets !! style=&amp;quot;width:0px;&amp;quot; | Tags&amp;#039;&lt;br /&gt;
    if #tags.includes == 0 then tags.includes[1] = &amp;#039;.+&amp;#039; end&lt;br /&gt;
    if #tags.excludes == 0 then tags.excludes[1] = &amp;#039;&amp;#039; end&lt;br /&gt;
    local include, exclude&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        include = false&lt;br /&gt;
        exclude = false&lt;br /&gt;
        for i, j in ipairs(tags.includes) do&lt;br /&gt;
            include = findKey(j, val.tags)&lt;br /&gt;
            if not include then break end&lt;br /&gt;
        end&lt;br /&gt;
        for _, j in ipairs(tags.excludes) do&lt;br /&gt;
            exclude = findKey(j, val.tags)&lt;br /&gt;
            if exclude then break end          &lt;br /&gt;
        end&lt;br /&gt;
        if (include and (not exclude)) and (findKey(sType, val.scopes) or findKey(sType, val.targets)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, preCollapse(val.example), lister(val.scopes), lister(val.targets), lister(val.tags), colNum=6}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(num)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- vanilla modifier types, rather bespoke because of differing data module format&lt;br /&gt;
function functTable.regularModType(sType, args, t)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    local modTypeData = mw.loadData(&amp;#039;Module:Modifier type/Notes&amp;#039;)&lt;br /&gt;
    if uString.match(sType, &amp;#039;%w&amp;#039;) then&lt;br /&gt;
        t[1] = &amp;#039; !! Localization !! style=&amp;quot;width:0px;&amp;quot; | Type !! style=&amp;quot;width:0px;&amp;quot; | Format !! style=&amp;quot;width:0px;&amp;quot; | Notes&amp;#039;&lt;br /&gt;
    else&lt;br /&gt;
        t[1] = &amp;#039; !! Localization !! style=&amp;quot;width:0px;&amp;quot; | Category !! style=&amp;quot;width:0px;&amp;quot; | Type !! style=&amp;quot;width:0px;&amp;quot; | Format !! style=&amp;quot;width:0px;&amp;quot; | Notes&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    local category, mType, mFormat, notes, id&lt;br /&gt;
    for key, val in sortedPairs(modTypeData) do&lt;br /&gt;
        for k, _ in pairs(args.modTypes) do&lt;br /&gt;
            category = uString.match(key, &amp;#039;^&amp;#039;..k)&lt;br /&gt;
            if category then break end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        for k, v in pairs(args.modSuf) do&lt;br /&gt;
            mType = uString.match(key, k..&amp;#039;$&amp;#039;) and v&lt;br /&gt;
            if mType then break end&lt;br /&gt;
        end&lt;br /&gt;
        if val.boolean then mType = &amp;#039;boolean&amp;#039; end&lt;br /&gt;
        mType = mType or &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
        if val.positive == &amp;#039;green&amp;#039; then mFormat = &amp;#039;good&amp;#039;&lt;br /&gt;
        elseif val.positive == &amp;#039;red&amp;#039; then mFormat = &amp;#039;bad&amp;#039;&lt;br /&gt;
        else mFormat = &amp;#039;neutral&amp;#039; end&lt;br /&gt;
        if val.percent then mFormat = &amp;#039;percent, &amp;#039;..mFormat end&lt;br /&gt;
&lt;br /&gt;
        notes = &amp;#039;&amp;#039;&lt;br /&gt;
        if val.notes then&lt;br /&gt;
            for _, note in ipairs(val.notes) do&lt;br /&gt;
                notes = notes .. &amp;#039;\n* &amp;#039; .. note&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if not uString.match(sType, &amp;#039;%w&amp;#039;) then&lt;br /&gt;
            id = key&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{id=id, key, val.loc, category, mType, mFormat, notes, colNum=6}&lt;br /&gt;
        elseif category and uString.match(sType, &amp;#039;^&amp;#039;..category..&amp;#039;$&amp;#039;) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.loc, mType, mFormat, notes, colNum=5}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- potential modifier types, also somewhat bespoke because of different data structure&lt;br /&gt;
function functTable.potentialModType(sType, args, t)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    local modTypeData = mw.loadData(&amp;#039;Module:Modifier type/Potential&amp;#039;)&lt;br /&gt;
    if uString.match(sType, &amp;#039;%w&amp;#039;) then&lt;br /&gt;
        t[1] = &amp;#039; !! class=unsortable | Description !! style=&amp;quot;width:0px;&amp;quot; | Type&amp;#039;&lt;br /&gt;
    else&lt;br /&gt;
        t[1] = &amp;#039; !! class=unsortable | Description !! style=&amp;quot;width:0px;&amp;quot; | Category !! style=&amp;quot;width:0px;&amp;quot; | Type&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    local category, mType, mFormat&lt;br /&gt;
    for key, val in sortedPairs(modTypeData) do&lt;br /&gt;
        for k, _ in pairs(args.modTypes) do&lt;br /&gt;
            category = uString.match(uString.lower(key), &amp;#039;^%$?(&amp;#039;..k..&amp;#039;)&amp;#039;)&lt;br /&gt;
            if category then break end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        for k, v in pairs(args.modSuf) do&lt;br /&gt;
            mType = uString.match(key, k..&amp;#039;$&amp;#039;) and v&lt;br /&gt;
            if mType then break end&lt;br /&gt;
        end&lt;br /&gt;
        mType = mType or &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
        if not uString.match(sType, &amp;#039;%w&amp;#039;) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{prev=t, key, val, category, mType, colNum=4}&lt;br /&gt;
        elseif category and uString.match(sType, &amp;#039;^&amp;#039;..category..&amp;#039;$&amp;#039;) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{prev=t, key, val, mType, colNum=3}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.regularEffect(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | Scopes !! style=&amp;quot;width:0px;&amp;quot; | Targets&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if ((not val.eType) or args.includeSpecial) and (findKey(sType, val.scopes) or findKey(sType, val.targets)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, preCollapse(val.example), lister(val.scopes), lister(val.targets), colNum=5}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.regularEventTarget(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | From scope !! style=&amp;quot;width:0px;&amp;quot; | To scope&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if ((not val.etType) or (not val.etType.wildCard)) and (findKey(sType, val.from) or findKey(sType, val.to)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, lister(val.from), lister(val.to), colNum=4}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.regularTrigger(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | Scopes !! style=&amp;quot;width:0px;&amp;quot; | Targets&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if ((not val.tType) or args.includeSpecial) and (findKey(sType, val.scopes) or findKey(sType, val.targets)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, preCollapse(val.example), lister(val.scopes), lister(val.targets), colNum=5}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.allEffect(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | Scopes !! style=&amp;quot;width:0px;&amp;quot; | Targets&amp;#039;&lt;br /&gt;
    local id = &amp;#039;&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if findKey(sType, val.scopes) or findKey(sType, val.targets) then&lt;br /&gt;
            id = key&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{id=id, key, val.description, preCollapse(val.example), lister(val.scopes), lister(val.targets), colNum=5}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.allEventTarget(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | From scope !! style=&amp;quot;width:0px;&amp;quot; | To scope&amp;#039;&lt;br /&gt;
    local id = &amp;#039;&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if findKey(sType, val.from) or findKey(sType, val.to) then&lt;br /&gt;
            id = key&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{id=id, key, val.description, lister(val.from), lister(val.to), colNum=4}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.allTrigger(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | Scopes !! style=&amp;quot;width:0px;&amp;quot; | Targets&amp;#039;&lt;br /&gt;
    local id = &amp;#039;&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if findKey(sType, val.scopes) or findKey(sType, val.targets) then&lt;br /&gt;
            id = key&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{id=id, key, val.description, preCollapse(val.example), lister(val.scopes), lister(val.targets), colNum=5}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.scopeEffect(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | Targets&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if ((not val.eType) or args.includeSpecial) and findKey(sType, val.scopes) then&lt;br /&gt;
            if noIterators and val.iterator then&lt;br /&gt;
            else&lt;br /&gt;
                key = keyBreak(key)&lt;br /&gt;
                num = num + 1&lt;br /&gt;
                t[num] = rowBuilder{key, val.description, preCollapse(val.example), lister(val.targets), colNum=4}&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
functTable.scopesEffect = functTable.scopeEffect&lt;br /&gt;
&lt;br /&gt;
function functTable.targetEffect(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | Scopes&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if ((not val.eType) or args.includeSpecial) and findKey(sType, val.targets) then&lt;br /&gt;
            if noIterators and val.iterator then&lt;br /&gt;
            else&lt;br /&gt;
                key = keyBreak(key)&lt;br /&gt;
                num = num + 1&lt;br /&gt;
                t[num] = rowBuilder{key, val.description, preCollapse(val.example), lister(val.scopes), colNum=4}&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
functTable.targetsEffect = functTable.targetEffect&lt;br /&gt;
&lt;br /&gt;
function functTable.scopeTrigger(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | Targets&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if ((not val.tType) or args.includeSpecial) and findKey(sType, val.scopes) then&lt;br /&gt;
            if noIterators and val.tType and val.tType.iterator then&lt;br /&gt;
            else&lt;br /&gt;
                key = keyBreak(key)&lt;br /&gt;
                num = num + 1&lt;br /&gt;
                t[num] = rowBuilder{key, val.description, preCollapse(val.example), lister(val.targets), colNum=4}&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
functTable.scopesTrigger = functTable.scopeTrigger&lt;br /&gt;
&lt;br /&gt;
function functTable.targetTrigger(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | Scopes&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if ((not val.tType) or args.includeSpecial) and findKey(sType, val.targets) then&lt;br /&gt;
            if noIterators and val.tType and val.tType.iterator then&lt;br /&gt;
            else&lt;br /&gt;
                key = keyBreak(key)&lt;br /&gt;
                num = num + 1&lt;br /&gt;
                t[num] = rowBuilder{key, val.description, preCollapse(val.example), lister(val.scopes), colNum=4}&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
functTable.targetsTrigger = functTable.targetTrigger&lt;br /&gt;
&lt;br /&gt;
function functTable.fromEventTarget(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | To scope&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if ((not val.etType) or (not val.etType.wildCard)) and findKey(sType, val.from) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, lister(val.to), colNum=3}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.toEventTarget(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | From scope&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if ((not val.etType) or (not val.etType.wildCard)) and findKey(sType, val.to) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, lister(val.from), colNum=3}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.iteratorEffect(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | From scopes !! style=&amp;quot;width:0px;&amp;quot; | To scope&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if val.eType == &amp;#039;iterator&amp;#039; and (findKey(sType, val.scopes) or findKey(sType, val.targets)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, preCollapse(val.example), lister(val.scopes), lister(val.targets), colNum=5}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.iteratorTrigger(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | From scopes !! style=&amp;quot;width:0px;&amp;quot; | To scope&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if (val.tType and val.tType.iterator) and (findKey(sType, val.scopes) or findKey(sType, val.targets)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, preCollapse(val.example), lister(val.scopes), lister(val.targets), colNum=5}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.flowEffect(sType, args)&lt;br /&gt;
    local t, num = {}, 0&lt;br /&gt;
    --t = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | Scopes !! style=&amp;quot;width:0px;&amp;quot; | Targets&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if val.eType == &amp;#039;flow&amp;#039; and (findKey(sType, val.scopes) or findKey(sType, val.targets)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, preCollapse(val.example), colNum=3}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.flowTrigger(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | From scopes !! style=&amp;quot;width:0px;&amp;quot; | To scope&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if (val.tType and val.tType.flow) and (findKey(sType, val.scopes) or findKey(sType, val.targets)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, preCollapse(val.example), lister(val.scopes), lister(val.targets), colNum=5}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.logEffect(sType, args)&lt;br /&gt;
    local t, num = {}, 0&lt;br /&gt;
    --t = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | Scopes !! style=&amp;quot;width:0px;&amp;quot; | Targets&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if val.eType == &amp;#039;log&amp;#039; and (findKey(sType, val.scopes) or findKey(sType, val.targets)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, preCollapse(val.example), colNum=3}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.logTrigger(sType, args)&lt;br /&gt;
    local t, num = {}, 0&lt;br /&gt;
    --t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | From scopes !! style=&amp;quot;width:0px;&amp;quot; | To scope&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if (val.tType and val.tType.log) and (findKey(sType, val.scopes) or findKey(sType, val.targets)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, preCollapse(val.example), colNum=3}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.variableEffect(sType, args)&lt;br /&gt;
    local t, num = {}, 0&lt;br /&gt;
    --t = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | Scopes !! style=&amp;quot;width:0px;&amp;quot; | Targets&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if val.eType == &amp;#039;variable&amp;#039; and (findKey(sType, val.scopes) or findKey(sType, val.targets)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, preCollapse(val.example), colNum=3}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.variableTrigger(sType, args)&lt;br /&gt;
    local t, num = {}, 0&lt;br /&gt;
    --t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | From scopes !! style=&amp;quot;width:0px;&amp;quot; | To scope&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if (val.tType and val.tType.variable) and (findKey(sType, val.scopes) or findKey(sType, val.targets)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, preCollapse(val.example), colNum=3}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.specialEffect(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | Type&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if (val.eType and val.eType ~= &amp;#039;iterator&amp;#039;) and (findKey(sType, val.scopes) or findKey(sType, val.targets)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, preCollapse(val.example), lang:ucfirst(val.eType), colNum=4}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.specialTrigger(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | Type&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if (val.tType and (not val.tType.iterator)) and (findKey(sType, val.scopes) or findKey(sType, val.targets)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, preCollapse(val.example), lang:ucfirst(lister(val.tType)), colNum=4}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.dataEventTarget(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | From scope !! style=&amp;quot;width:0px;&amp;quot; | To scope&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if (val.etType and val.etType.data) and (findKey(sType, val.from) or findKey(sType, val.to)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, lister(val.from), lister(val.to), colNum=4}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function functTable.wildCardEventTarget(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | From scope !! style=&amp;quot;width:0px;&amp;quot; | To scope&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if (val.etType and val.etType.wildCard) and (findKey(sType, val.from) or findKey(sType, val.to)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, lister(val.from), lister(val.to), colNum=4}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
functTable[&amp;#039;wild cardEventTarget&amp;#039;] = functTable.wildCardEventTarget&lt;br /&gt;
&lt;br /&gt;
function functTable.scopeDataEventTarget(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | From scope !! style=&amp;quot;width:0px;&amp;quot; | To scope&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if (val.etType and val.etType.data) and not (findKey(&amp;#039;boolean&amp;#039;, val.to) or findKey(&amp;#039;value&amp;#039;, val.to)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, lister(val.from), lister(val.to), colNum=4}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
functTable[&amp;#039;specified scopeEventTarget&amp;#039;] = functTable.scopeDataEventTarget&lt;br /&gt;
&lt;br /&gt;
function functTable.scopeContextEventTarget(sType, args)&lt;br /&gt;
    local t, num = {}, 1&lt;br /&gt;
    t[1] = &amp;#039; !! style=&amp;quot;width:0px;&amp;quot; | From scope !! style=&amp;quot;width:0px;&amp;quot; | To scope&amp;#039;&lt;br /&gt;
    for key, val in sortedPairs(args.data) do&lt;br /&gt;
        if (not val.etType) and not (findKey(&amp;#039;boolean&amp;#039;, val.to) or findKey(&amp;#039;value&amp;#039;, val.to)) then&lt;br /&gt;
            key = keyBreak(key)&lt;br /&gt;
            num = num + 1&lt;br /&gt;
            t[num] = rowBuilder{key, val.description, lister(val.from), lister(val.to), colNum=4}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tConcat(t)&lt;br /&gt;
end&lt;br /&gt;
functTable[&amp;#039;contextual scopeEventTarget&amp;#039;] = functTable.scopeContextEventTarget&lt;br /&gt;
&lt;br /&gt;
-- Utility function to build table of usable tags&lt;br /&gt;
function p.getTags(tType)&lt;br /&gt;
    local t = &amp;#039;&amp;#039;&lt;br /&gt;
    local tTags = {}&lt;br /&gt;
    local docData = mw.loadData(&amp;#039;Module:Script docs/&amp;#039;..tType)&lt;br /&gt;
&lt;br /&gt;
    if not docData then return &amp;quot;Error: bad tType specified&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    for k, v in pairs(docData) do&lt;br /&gt;
        for n, _ in pairs(v.tags) do&lt;br /&gt;
            tTags[n] = true&lt;br /&gt;
        end&lt;br /&gt;
--[[&lt;br /&gt;
        if v.from then&lt;br /&gt;
            for n, _ in pairs(v.from) do tTags[n] = true end&lt;br /&gt;
        end&lt;br /&gt;
        if v.to then&lt;br /&gt;
            for n, _ in pairs(v.to) do tTags[n] = true end&lt;br /&gt;
        end&lt;br /&gt;
        if v.scopes then&lt;br /&gt;
            for n, _ in pairs(v.scopes) do tTags[n] = true end&lt;br /&gt;
        end&lt;br /&gt;
        if v.targets then&lt;br /&gt;
            for n, _ in pairs(v.targets) do tTags[n] = true end&lt;br /&gt;
        end&lt;br /&gt;
--]]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for k, _ in sortedPairs(tTags) do&lt;br /&gt;
        t = uString.format(&amp;quot;%s\n|-\n| %s&amp;quot;, t, k)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return &amp;#039;{| class=&amp;quot;wikitable&amp;quot;&amp;#039; .. t .. &amp;#039;\n|}&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>天津风不是天津的风</name></author>
	</entry>
</feed>