<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.jadetimber.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AT</id>
	<title>Module:T - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.jadetimber.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AT"/>
	<link rel="alternate" type="text/html" href="https://wiki.jadetimber.com/index.php?title=Module:T&amp;action=history"/>
	<updated>2026-04-17T21:32:38Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.1</generator>
	<entry>
		<id>https://wiki.jadetimber.com/index.php?title=Module:T&amp;diff=729&amp;oldid=prev</id>
		<title>Aki: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.jadetimber.com/index.php?title=Module:T&amp;diff=729&amp;oldid=prev"/>
		<updated>2025-10-10T05:05:51Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 23:05, 9 October 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Aki</name></author>
	</entry>
	<entry>
		<id>https://wiki.jadetimber.com/index.php?title=Module:T&amp;diff=728&amp;oldid=prev</id>
		<title>Fandom&gt;ExE Boss: Bump version (see revision 155423)</title>
		<link rel="alternate" type="text/html" href="https://wiki.jadetimber.com/index.php?title=Module:T&amp;diff=728&amp;oldid=prev"/>
		<updated>2021-06-04T19:23:51Z</updated>

		<summary type="html">&lt;p&gt;Bump version (see &lt;a href=&quot;/index.php/Special:Diff/155423&quot; title=&quot;Special:Diff/155423&quot;&gt;revision 155423&lt;/a&gt;)&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;
--------------------------------------------------------------------------------&lt;br /&gt;
-- A feature-packed example generator for brace-based wikitext.&lt;br /&gt;
--&lt;br /&gt;
-- @module T&lt;br /&gt;
-- @alias p&lt;br /&gt;
-- @version 0.6.4&lt;br /&gt;
-- @release experimental&lt;br /&gt;
-- @requires [[Global Lua Modules/Arguments|Module:Arguments]]&lt;br /&gt;
-- @requires [[Global Lua Modules/User error|Module:User error]]&lt;br /&gt;
-- @requires [[Global Lua Modules/Yesno|Module:Yesno]]&lt;br /&gt;
-- @author [[User:DarthKitty]]&lt;br /&gt;
-- @author [[User:Speedit]]&lt;br /&gt;
-- @author [[User:ExE Boss]]&lt;br /&gt;
--&lt;br /&gt;
-- @todo Extract CSS to stylesheet; transition from data-attributes to classes.&lt;br /&gt;
-- @todo Consider adding i18n for error messages, flags, &amp;amp;c.&lt;br /&gt;
-- @todo Consider adding generator(s?) for magic words and parser functions.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&amp;quot;libraryUtil&amp;quot;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
&lt;br /&gt;
local getArgs = require(&amp;quot;Dev:Arguments&amp;quot;).getArgs&lt;br /&gt;
local userError = require(&amp;quot;Dev:User error&amp;quot;)&lt;br /&gt;
local yesno = require(&amp;quot;Dev:Yesno&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Parses a parameter to get its components: its name (optional), and either its&lt;br /&gt;
-- value or its description (but not both).&lt;br /&gt;
--&lt;br /&gt;
-- @param {string} param&lt;br /&gt;
--     A parameter.&lt;br /&gt;
-- @returns {table}&lt;br /&gt;
--     The components of a parameter.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function parseParam(param)&lt;br /&gt;
    local tmp = param&lt;br /&gt;
    local name, value, description&lt;br /&gt;
&lt;br /&gt;
    -- the parameter&amp;#039;s name is anything to the left of the first equals sign;&lt;br /&gt;
    -- the equals sign can be escaped, for wikis that don&amp;#039;t have [[Template:=]]&lt;br /&gt;
    if tmp:find(&amp;quot;=&amp;quot;) or tmp:find(mw.text.nowiki(&amp;quot;=&amp;quot;)) then&lt;br /&gt;
        name, tmp = tmp&lt;br /&gt;
            :gsub(mw.text.nowiki(&amp;quot;=&amp;quot;), &amp;quot;=&amp;quot;, 1)&lt;br /&gt;
            :match(&amp;quot;^(.-)%s*=%s*(.-)$&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- if the remaining text is wrapped in matching quotes, then it&amp;#039;s a literal&lt;br /&gt;
    -- value; otherwise, it&amp;#039;s a description of the parameter&lt;br /&gt;
    local first = tmp:sub(1, 1)&lt;br /&gt;
    local last = tmp:sub(-1)&lt;br /&gt;
&lt;br /&gt;
    if (first == &amp;#039;&amp;quot;&amp;#039; and last == &amp;#039;&amp;quot;&amp;#039;) or (first == &amp;quot;&amp;#039;&amp;quot; and last == &amp;quot;&amp;#039;&amp;quot;) then&lt;br /&gt;
        value = tmp:sub(2, -2)&lt;br /&gt;
    elseif tmp == &amp;quot;&amp;quot; then&lt;br /&gt;
        description = &amp;quot;...&amp;quot; -- the description cannot be an empty string&lt;br /&gt;
    else&lt;br /&gt;
        description = tmp&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return {&lt;br /&gt;
        name = name,&lt;br /&gt;
        value = value,&lt;br /&gt;
        description = description&lt;br /&gt;
    }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- The heart of the module. Transforms a list of parameters into wikitext&lt;br /&gt;
-- syntax.&lt;br /&gt;
--&lt;br /&gt;
-- @param {string} mode&lt;br /&gt;
--     Which kind of brace-based wikitext we&amp;#039;re dealing with.&lt;br /&gt;
-- @param {string} opener&lt;br /&gt;
--     Text to insert between the two left-braces and the first parameter.&lt;br /&gt;
-- @param[opt] {table|nil} params&lt;br /&gt;
--     A sequentual table of parameters.&lt;br /&gt;
-- @param[opt] {table|nil} options&lt;br /&gt;
--     A table with configuration flags.&lt;br /&gt;
-- @param[opt] {boolean|nil} options.multiline&lt;br /&gt;
-- @param[opt] {boolean|nil} options.subst&lt;br /&gt;
-- @returns {string}&lt;br /&gt;
--     A blob of wikitext describing any brace-based syntax.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function builder(mode, opener, params, options)&lt;br /&gt;
    checkType(&amp;quot;builder&amp;quot;, 2, opener, &amp;quot;string&amp;quot;)&lt;br /&gt;
    checkType(&amp;quot;builder&amp;quot;, 3, params, &amp;quot;table&amp;quot;, true)&lt;br /&gt;
    checkType(&amp;quot;builder&amp;quot;, 4, options, &amp;quot;table&amp;quot;, true)&lt;br /&gt;
&lt;br /&gt;
    params = params or {}&lt;br /&gt;
    options = options or {}&lt;br /&gt;
&lt;br /&gt;
    local html = mw.html.create(&amp;quot;code&amp;quot;)&lt;br /&gt;
        :attr(&amp;quot;data-t-role&amp;quot;, &amp;quot;wrapper&amp;quot;)&lt;br /&gt;
        :attr(&amp;quot;data-t-mode&amp;quot;, mode)&lt;br /&gt;
        :css(&amp;quot;all&amp;quot;, &amp;quot;unset&amp;quot;)&lt;br /&gt;
        :css(&amp;quot;font-family&amp;quot;, &amp;quot;monospace&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    local openerSpan =&lt;br /&gt;
        html:tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
            :attr(&amp;quot;data-t-role&amp;quot;, &amp;quot;opener&amp;quot;)&lt;br /&gt;
            :wikitext(mw.text.nowiki(&amp;quot;{&amp;quot;):rep(2))&lt;br /&gt;
&lt;br /&gt;
	if options.subst then&lt;br /&gt;
		openerSpan:wikitext(&amp;quot;subst:&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    openerSpan:wikitext(opener)&lt;br /&gt;
&lt;br /&gt;
    if options.multiline then&lt;br /&gt;
        html:attr(&amp;quot;data-t-multiline&amp;quot;, &amp;quot;data-t-multiline&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for i, param in ipairs(params) do&lt;br /&gt;
        if type(param) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
            error(&amp;quot;invalid entry #&amp;quot; .. i .. &amp;quot; in parameter list&amp;quot;, 3)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        local components = parseParam(param)&lt;br /&gt;
        local paramHtml = html:tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
            :attr(&amp;quot;data-t-role&amp;quot;, &amp;quot;parameter&amp;quot;)&lt;br /&gt;
            :attr(&amp;quot;data-t-index&amp;quot;, i)&lt;br /&gt;
            :wikitext(mw.text.nowiki(&amp;quot;|&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
        if options.multiline then&lt;br /&gt;
            paramHtml:css(&amp;quot;display&amp;quot;, &amp;quot;block&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if components.name then&lt;br /&gt;
            paramHtml:tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
                :attr(&amp;quot;data-t-role&amp;quot;, &amp;quot;parameter-name&amp;quot;)&lt;br /&gt;
                :css(&amp;quot;font-weight&amp;quot;, &amp;quot;bold&amp;quot;)&lt;br /&gt;
                :wikitext(components.name)&lt;br /&gt;
&lt;br /&gt;
            paramHtml:wikitext(&amp;quot; = &amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if components.value then&lt;br /&gt;
            paramHtml:tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
                :attr(&amp;quot;data-t-role&amp;quot;, &amp;quot;parameter-value&amp;quot;)&lt;br /&gt;
                :wikitext(components.value)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if components.description then&lt;br /&gt;
            paramHtml:tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
                :attr(&amp;quot;data-t-role&amp;quot;, &amp;quot;parameter-description&amp;quot;)&lt;br /&gt;
                :css(&amp;quot;opacity&amp;quot;, &amp;quot;0.65&amp;quot;)&lt;br /&gt;
                :wikitext(mw.text.nowiki(&amp;quot;&amp;lt;&amp;quot;))&lt;br /&gt;
                :wikitext(components.description)&lt;br /&gt;
                :wikitext(mw.text.nowiki(&amp;quot;&amp;gt;&amp;quot;))&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    html:tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
        :attr(&amp;quot;data-t-role&amp;quot;, &amp;quot;closer&amp;quot;)&lt;br /&gt;
        :wikitext(mw.text.nowiki(&amp;quot;}&amp;quot;):rep(2))&lt;br /&gt;
&lt;br /&gt;
    return tostring(html)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Resolves a transclusion according to the MediaWiki&lt;br /&gt;
-- transclusion resolution algorithm.&lt;br /&gt;
--&lt;br /&gt;
-- @param {string} title&lt;br /&gt;
--        The name of the transclusion to resolve.&lt;br /&gt;
-- @return {string}&lt;br /&gt;
--         The resolved transclusion with the namespace prefix.&lt;br /&gt;
-- @see [[w:Template:Transclude]]&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function resolveTransclusion(title)&lt;br /&gt;
	checkType(&amp;quot;resolveTransclusion&amp;quot;, 1, title, &amp;quot;string&amp;quot;)&lt;br /&gt;
	local i = mw.ustring.find(title, &amp;quot;%:&amp;quot;)&lt;br /&gt;
	if i == 1 then&lt;br /&gt;
		return mw.ustring.sub(title, 2)&lt;br /&gt;
	elseif i ~= nil then&lt;br /&gt;
		return title&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;Template:&amp;quot; .. title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Generator for transclusion syntax, e.g. `{{foo}}`, `{{:foo}}`,&lt;br /&gt;
-- or `{{Template:Foo}}`.&lt;br /&gt;
--&lt;br /&gt;
-- @param {string} title&lt;br /&gt;
--     The name of the template to link to.&lt;br /&gt;
-- @param[opt] {table|nil} params&lt;br /&gt;
--     A sequentual table of parameters.&lt;br /&gt;
-- @param[opt] {table|nil} options&lt;br /&gt;
--     A table with configuration flags.&lt;br /&gt;
-- @param[opt] {boolean|nil} options.multiline&lt;br /&gt;
-- @param[opt] {boolean|nil} options.subst&lt;br /&gt;
-- @returns {string}&lt;br /&gt;
--     A blob of wikitext describing a template.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
function p.transclusion(title, params, options)&lt;br /&gt;
    if type(title) ~= &amp;quot;string&amp;quot; or title == &amp;quot;&amp;quot; then&lt;br /&gt;
        error(&amp;quot;no title specified&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return builder(&lt;br /&gt;
        &amp;quot;transclusion&amp;quot;,&lt;br /&gt;
        &amp;quot;[[:&amp;quot; .. resolveTransclusion(title) .. &amp;quot;|&amp;quot; .. title .. &amp;quot;]]&amp;quot;,&lt;br /&gt;
        params,&lt;br /&gt;
        options&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Generator for invocation syntax, e.g. `{{#invoke:foo|bar}}`.&lt;br /&gt;
--&lt;br /&gt;
-- @param {string} title&lt;br /&gt;
--     The name of the module to link to, without the namespace prefix.&lt;br /&gt;
-- @param {string} func&lt;br /&gt;
--     The name of the function to call.&lt;br /&gt;
-- @param[opt] {table|nil} params&lt;br /&gt;
--     A sequentual table of parameters.&lt;br /&gt;
-- @param[opt] {table|nil} options&lt;br /&gt;
--     A table with configuration flags.&lt;br /&gt;
-- @param[opt] {boolean|nil} options.multiline&lt;br /&gt;
-- @param[opt] {boolean|nil} options.subst&lt;br /&gt;
-- @returns {string}&lt;br /&gt;
--     A blob of wikitext describing a module.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
function p.invocation(title, func, params, options)&lt;br /&gt;
    if type(title) ~= &amp;quot;string&amp;quot; or title == &amp;quot;&amp;quot; then&lt;br /&gt;
        error(&amp;quot;no module specified&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if type(func) ~= &amp;quot;string&amp;quot; or func == &amp;quot;&amp;quot; then&lt;br /&gt;
        error(&amp;quot;no function specified&amp;quot;, 2)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local link = &amp;quot;[[Module:&amp;quot; .. title .. &amp;quot;|&amp;quot; .. title .. &amp;quot;]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return builder(&lt;br /&gt;
        &amp;quot;invocation&amp;quot;,&lt;br /&gt;
        &amp;quot;#invoke:&amp;quot; .. link .. mw.text.nowiki(&amp;quot;|&amp;quot;) .. func,&lt;br /&gt;
        params,&lt;br /&gt;
        options&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Entry point from the wikitext side. Determines which generator to use based&lt;br /&gt;
-- on the provided arguments.&lt;br /&gt;
--&lt;br /&gt;
-- @param {table|Frame} frame&lt;br /&gt;
--     A frame object whose arguments will determine the correct generator&lt;br /&gt;
--     to use.&lt;br /&gt;
-- @returns {string}&lt;br /&gt;
--     A blob of wikitext describing any brace-based syntax.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local args = getArgs(frame, {removeBlanks = false})&lt;br /&gt;
    local mode, minimumArity&lt;br /&gt;
&lt;br /&gt;
    if yesno(args.invocation) or yesno(args.i) then&lt;br /&gt;
        mode = &amp;quot;invocation&amp;quot;&lt;br /&gt;
        minimumArity = 2&lt;br /&gt;
    else&lt;br /&gt;
        mode = &amp;quot;transclusion&amp;quot;&lt;br /&gt;
        minimumArity = 1&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local params = {}&lt;br /&gt;
    local options = {&lt;br /&gt;
        multiline = yesno(args.multiline) or yesno(args.m),&lt;br /&gt;
        subst = yesno(args.subst) or yesno(args.s),&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- a dynamically-generated list of arguments to the generator&lt;br /&gt;
    -- required arguments are inserted before `params` and `options`&lt;br /&gt;
    local varargs = {params, options}&lt;br /&gt;
&lt;br /&gt;
    for i, value in ipairs(args) do&lt;br /&gt;
        if i &amp;lt;= minimumArity then&lt;br /&gt;
            -- pass the first few values directly to the generator&lt;br /&gt;
            -- these are used to calculate the opener&lt;br /&gt;
            table.insert(varargs, i, value)&lt;br /&gt;
        else&lt;br /&gt;
            -- put the remaining values in a table, and pass it to the generator&lt;br /&gt;
            -- these are shown as parameters in the resulting wikitext&lt;br /&gt;
            params[#params + 1] = value&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local success, response = pcall(p[mode], unpack(varargs))&lt;br /&gt;
&lt;br /&gt;
    return success and response or userError(response)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Fandom&gt;ExE Boss</name></author>
	</entry>
</feed>