<?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%3AInstall</id>
	<title>Module:Install - 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%3AInstall"/>
	<link rel="alternate" type="text/html" href="https://wiki.jadetimber.com/index.php?title=Module:Install&amp;action=history"/>
	<updated>2026-04-17T19:30: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:Install&amp;diff=745&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:Install&amp;diff=745&amp;oldid=prev"/>
		<updated>2025-10-10T05:05:53Z</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:Install&amp;diff=744&amp;oldid=prev</id>
		<title>Fandom&gt;KockaAdmiralac: Add a proper list entry to the install notice for enabling sitewide JS</title>
		<link rel="alternate" type="text/html" href="https://wiki.jadetimber.com/index.php?title=Module:Install&amp;diff=744&amp;oldid=prev"/>
		<updated>2023-07-19T10:36:09Z</updated>

		<summary type="html">&lt;p&gt;Add a proper list entry to the install notice for enabling sitewide JS&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;
--- Installation template module for Fandom.&lt;br /&gt;
--  Support for JS and CSS at this time.&lt;br /&gt;
--  @module             install&lt;br /&gt;
--  @alias              p&lt;br /&gt;
--  @version            1.6.0&lt;br /&gt;
--  @usage              {{#invoke:install|function}}&lt;br /&gt;
--  @author             [[User:MACH-59330|MACH-59330]]&lt;br /&gt;
--  @author             [[User:Fngplg|Fngplg]]&lt;br /&gt;
--  @author             [[User:DarthKitty|DarthKitty]]&lt;br /&gt;
--  @see                [[:Category:Installation templates]]&lt;br /&gt;
--  @release            stable&lt;br /&gt;
local p = {}&lt;br /&gt;
require(&amp;#039;Dev:No interwiki access&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
--  Dependencies.&lt;br /&gt;
local yesno = require(&amp;#039;Dev:Yesno&amp;#039;)&lt;br /&gt;
local title = mw.title.getCurrentTitle()&lt;br /&gt;
local conf = mw.loadData(&amp;#039;Dev:Install/config&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
--- Module message data.&lt;br /&gt;
--  @variable       {table} i18n&lt;br /&gt;
--  @see            [[Module:Install/i18n]]&lt;br /&gt;
local i18n = require(&amp;#039;Dev:I18n&amp;#039;).loadMessages(&amp;#039;Install&amp;#039;, &amp;#039;Common&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
--- Utility for usage validation.&lt;br /&gt;
--  @function       use&lt;br /&gt;
--  @param          {string} code Coding language supported by module.&lt;br /&gt;
--  @param          {string} val Valid usage scope in configuration.&lt;br /&gt;
--  @return         {string} Valid usage to map against configuration.&lt;br /&gt;
--  @local&lt;br /&gt;
local function use(code, val)&lt;br /&gt;
    code = mw.text.trim(code)&lt;br /&gt;
    val = mw.text.trim(val)&lt;br /&gt;
&lt;br /&gt;
    -- Code support validation.&lt;br /&gt;
    if&lt;br /&gt;
        code ~= &amp;#039;js&amp;#039; and&lt;br /&gt;
        code ~= &amp;#039;css&amp;#039; and&lt;br /&gt;
        code ~= &amp;#039;html&amp;#039;&lt;br /&gt;
    then&lt;br /&gt;
        error(&amp;#039;unrecognised code language &amp;quot;&amp;#039; + code + &amp;#039;&amp;quot; supplied&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Configuration validation.&lt;br /&gt;
    if (conf[val] or {})[code] then&lt;br /&gt;
        return val&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return &amp;#039;default&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Usage parameter getter from child frame.&lt;br /&gt;
--  Relies on @{frame:getParent} to function correctly.&lt;br /&gt;
--  @param          {table} frame Invocation frame object.&lt;br /&gt;
--  @return         {string} `Use` template parameter, or empty string.&lt;br /&gt;
--  @local&lt;br /&gt;
local function getUse(frame)&lt;br /&gt;
    local parentFrame = frame:getParent() or {}&lt;br /&gt;
    local parentArgs = parentFrame.args or {}&lt;br /&gt;
    return parentArgs.Use or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Utility for message key shorthand expansion.&lt;br /&gt;
--  @param          {string} val Key shorthand to expand.&lt;br /&gt;
--  @return         {string} Expanded value key for i18n.&lt;br /&gt;
local function expand(val)&lt;br /&gt;
    local msg = {&lt;br /&gt;
        G = &amp;#039;global&amp;#039;,&lt;br /&gt;
        L = &amp;#039;local&amp;#039;,&lt;br /&gt;
        P = &amp;#039;personal&amp;#039;,&lt;br /&gt;
        S = &amp;#039;sitewide&amp;#039;,&lt;br /&gt;
        T = &amp;#039;template&amp;#039;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return msg[val] or &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Installation header generator.&lt;br /&gt;
--  @param          {table} frame Frame invocation object.&lt;br /&gt;
--  @param          {string} frame.args[1] Section usage scope.&lt;br /&gt;
--  @raise          &amp;#039;not enough arguments supplied to install.header&amp;#039;&lt;br /&gt;
--  @usage          {{#invoke:install|header|usage}}&lt;br /&gt;
--  @return         {string} Localised installation header.&lt;br /&gt;
function p.header(frame)&lt;br /&gt;
    if not frame.args or not frame.args[1] then&lt;br /&gt;
        error(&amp;#039;not enough arguments supplied to install.header&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local usage = expand(mw.text.trim(frame.args[1]))&lt;br /&gt;
    local lang = mw.language.new(i18n:useUserLang():getLang())&lt;br /&gt;
    local kind = lang:ucfirst(i18n:msg(usage, &amp;#039;1&amp;#039;))&lt;br /&gt;
&lt;br /&gt;
    return i18n:msg(&amp;#039;title&amp;#039;, kind, usage)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Installation text generator.&lt;br /&gt;
--  @param          {table} frame Frame invocation object.&lt;br /&gt;
--  @param          {string} frame.args[1] Code language.&lt;br /&gt;
--  @raise          &amp;#039;not enough arguments supplied to install.text&amp;#039;&lt;br /&gt;
--  @usage          {{#invoke:install|text|code}}&lt;br /&gt;
--  @return         {string} Localised instruction for installation.&lt;br /&gt;
function p.text(frame)&lt;br /&gt;
    if not frame.args or not frame.args[1] then&lt;br /&gt;
        error(&amp;#039;not enough arguments supplied to install.text&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local code = mw.text.trim(frame.args[1])&lt;br /&gt;
    local lang = {&lt;br /&gt;
        css = &amp;#039;CSS&amp;#039;,&lt;br /&gt;
        js = &amp;#039;JavaScript&amp;#039;,&lt;br /&gt;
        html = i18n:inUserLang():msg(&amp;#039;template&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- I18n logic.&lt;br /&gt;
    local sub = &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    if code == &amp;#039;js&amp;#039; then&lt;br /&gt;
        sub = i18n:inUserLang():msg(&amp;#039;installation-merge&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
        if mw.ustring.find(sub, &amp;#039;%s&amp;#039;) then&lt;br /&gt;
            sub = &amp;#039; &amp;#039; .. sub&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return i18n:inUserLang():msg(&amp;#039;installation-text&amp;#039;, lang[code], sub)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Installation label generator.&lt;br /&gt;
--  @param          {table} frame Frame invocation object.&lt;br /&gt;
--  @param          {string} frame.args[1] Code language.&lt;br /&gt;
--  @param          {string} frame.args[2] Scope of installation label.&lt;br /&gt;
--  @raise          &amp;#039;not enough arguments supplied to install.label&amp;#039;&lt;br /&gt;
--  @usage          {{#invoke:install|label|code|scope}}&lt;br /&gt;
--  @return         {string} Localised label describing scope.&lt;br /&gt;
function p.label(frame)&lt;br /&gt;
    if&lt;br /&gt;
        not frame.args or&lt;br /&gt;
        not frame.args[1] or&lt;br /&gt;
        not frame.args[2]&lt;br /&gt;
    then&lt;br /&gt;
        error(&amp;#039;not enough arguments supplied to install.label&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local code = mw.text.trim(frame.args[1])&lt;br /&gt;
    local usage = conf[use(frame.args[1], getUse(frame))].label&lt;br /&gt;
    local scope = mw.text.trim(frame.args[2])&lt;br /&gt;
    local label = i18n:inUserLang():fromSource(&amp;#039;Common&amp;#039;):msg(expand(scope))&lt;br /&gt;
&lt;br /&gt;
    return usage&lt;br /&gt;
        and (label .. &amp;#039; (&amp;#039; .. i18n:inUserLang():msg(usage.key) .. &amp;#039;)&amp;#039;)&lt;br /&gt;
        or label&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Installation link generator.&lt;br /&gt;
--  @param           {table} frame Frame invocation object.&lt;br /&gt;
--  @param           {string} frame.args[1] Code language.&lt;br /&gt;
--  @param           {string} frame.args[2] Scope of installation link.&lt;br /&gt;
--  @param           {string} frame.args[3] Template page name (or empty string).&lt;br /&gt;
--  @usage           {{#invoke:install|label|code|scope|usage}}&lt;br /&gt;
--  @raise           &amp;#039;not enough arguments supplied to install.link&amp;#039;&lt;br /&gt;
--  @return          {string} Wikitext link or empty string.&lt;br /&gt;
function p.link(frame)&lt;br /&gt;
    if&lt;br /&gt;
        not frame.args or&lt;br /&gt;
        not frame.args[1] or&lt;br /&gt;
        not frame.args[2]&lt;br /&gt;
    then&lt;br /&gt;
        error(&amp;#039;not enough arguments supplied to install.link&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local code = mw.text.trim(frame.args[1])&lt;br /&gt;
    local usage = use(frame.args[1], getUse(frame))&lt;br /&gt;
    local scope = mw.text.trim(frame.args[2])&lt;br /&gt;
    local link = conf[usage][code][scope]&lt;br /&gt;
&lt;br /&gt;
    if not link then&lt;br /&gt;
        return &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Special logic for HTML Install&lt;br /&gt;
    if code == &amp;#039;html&amp;#039; then&lt;br /&gt;
        local page = frame.args[3]&lt;br /&gt;
        local subpagePtn&lt;br /&gt;
&lt;br /&gt;
        -- Strip language subpage for install link.&lt;br /&gt;
        if #mw.language.fetchLanguageName(title.subpageText) ~= 0 then&lt;br /&gt;
            page = page:gsub(&amp;#039;/[%w-]+$&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        page = mw.ustring.gsub(page, &amp;#039;^%l&amp;#039;, mw.ustring.upper)&lt;br /&gt;
        link = mw.ustring.gsub(link, &amp;#039;$1&amp;#039;, page)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return &amp;#039;[[&amp;#039; .. link .. &amp;#039;]]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Installation code page formatter for JS scripts.&lt;br /&gt;
--  @param          {table} frame Frame invocation object.&lt;br /&gt;
--  @param          {string} frame.args[1] Path to code page.&lt;br /&gt;
--  @param          {string} frame.args.mw MediaWiki prefix boolean.&lt;br /&gt;
--  @raise          &amp;#039;not enough arguments supplied to install.script&amp;#039;&lt;br /&gt;
--  @usage          {{#invoke:install|script|codepage|source|mw=1}}&lt;br /&gt;
--  @return         {string} Path to code page.&lt;br /&gt;
function p.script(frame)&lt;br /&gt;
    if not frame:getParent() then&lt;br /&gt;
        error(&amp;#039;no parent frame available to install.script&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local codepage = mw.text.trim(frame:getParent().args.codepage or &amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    -- Conditional source extraction.&lt;br /&gt;
    if codepage == &amp;#039;&amp;#039; then&lt;br /&gt;
        codepage = title.baseText .. &amp;#039;.js&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Post-processing for code page paths.&lt;br /&gt;
    codepage = mw.ustring.gsub(codepage, &amp;#039;MediaWiki:&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    if mw.ustring.find(codepage, &amp;#039;:&amp;#039;) == nil then&lt;br /&gt;
        codepage = &amp;#039;dev:&amp;#039; .. codepage&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Namespace prefix (&amp;#039;MediaWiki&amp;#039;).&lt;br /&gt;
    if yesno(frame.args.mw) then&lt;br /&gt;
        local resource = mw.text.split(codepage, &amp;#039;:&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
        table.insert(resource, 2, mw.site.namespaces[8].name)&lt;br /&gt;
&lt;br /&gt;
        codepage = table.concat(resource, &amp;#039;:&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return codepage&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Installation notice list generator.&lt;br /&gt;
--  @param       {table} frame Frame invocation object.&lt;br /&gt;
--  @param       {string} frame.args[1] Code language.&lt;br /&gt;
--  @raise       &amp;#039;not enough arguments supplied to install.notice&amp;#039;&lt;br /&gt;
--  @usage       {{#invoke:install|label|code|usage}}&lt;br /&gt;
--  @return      {string} Localised installation notice list.&lt;br /&gt;
function p.notice(frame)&lt;br /&gt;
    if not frame.args or not frame.args[1] then&lt;br /&gt;
        error(&amp;#039;not enough arguments supplied to install.notice&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local code = mw.text.trim(frame.args[1])&lt;br /&gt;
    local usage&lt;br /&gt;
&lt;br /&gt;
    if code ~= &amp;#039;lua&amp;#039; then&lt;br /&gt;
        usage = use(frame.args[1], getUse(frame))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local import = mw.text.trim(frame.args.import or &amp;#039;1&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    -- Message conditionals.&lt;br /&gt;
    local type_messages = {&lt;br /&gt;
        css = &amp;#039;stylesheet&amp;#039;,&lt;br /&gt;
        html = &amp;#039;template&amp;#039;,&lt;br /&gt;
        js = &amp;#039;script&amp;#039;,&lt;br /&gt;
        lua = &amp;#039;module&amp;#039;&lt;br /&gt;
    }&lt;br /&gt;
    local list = {}&lt;br /&gt;
&lt;br /&gt;
    -- Devmodule alternative notice (Lua).&lt;br /&gt;
    list[&amp;#039;devmodule-template&amp;#039;] = {&lt;br /&gt;
        bool = function (code, usage)&lt;br /&gt;
            return code == &amp;#039;lua&amp;#039; and mw.text.split(title.text, &amp;#039;/&amp;#039;)[2] ~= &amp;#039;Devmodule&amp;#039;&lt;br /&gt;
        end,&lt;br /&gt;
        sub = {}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Import combination message (CSS/JS).&lt;br /&gt;
    list[&amp;#039;import-combination&amp;#039;] = {&lt;br /&gt;
        bool = function (code, usage)&lt;br /&gt;
            return&lt;br /&gt;
                (code == &amp;#039;css&amp;#039; or code == &amp;#039;js&amp;#039;) and&lt;br /&gt;
                tonumber(import) == 1 and (&lt;br /&gt;
                    conf[usage][code].G ~= nil or&lt;br /&gt;
                    conf[usage][code].P ~= nil or&lt;br /&gt;
                    conf[usage][code].S ~= &amp;#039;MediaWiki:ImportJS&amp;#039;&lt;br /&gt;
                )&lt;br /&gt;
        end,&lt;br /&gt;
        sub = {&lt;br /&gt;
            i18n:inUserLang():msg(type_messages[code], &amp;#039;2&amp;#039;)&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Sitewide JS enabling (JS).&lt;br /&gt;
    list[&amp;#039;enable-sitewide-js&amp;#039;] = {&lt;br /&gt;
        bool = function (code, usage)&lt;br /&gt;
            return code == &amp;#039;js&amp;#039; and conf[usage][code].S ~= nil&lt;br /&gt;
        end,&lt;br /&gt;
        sub = {}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Personal JS preferences notice (JS).&lt;br /&gt;
    list[&amp;#039;enable-personal-js&amp;#039;] = {&lt;br /&gt;
        bool = function (code, usage)&lt;br /&gt;
            return code == &amp;#039;js&amp;#039; and conf[usage][code].P ~= nil&lt;br /&gt;
        end,&lt;br /&gt;
        sub = {}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Wikitext source mode notice (HTML).&lt;br /&gt;
    list[&amp;#039;source-mode-html&amp;#039;] = {&lt;br /&gt;
        bool = function (code, usage)&lt;br /&gt;
            return code == &amp;#039;html&amp;#039; and conf[usage][code] ~= nil&lt;br /&gt;
        end,&lt;br /&gt;
        sub = {}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Lua templating guidance notice (Lua).&lt;br /&gt;
    list[&amp;#039;lua-templating&amp;#039;] = {&lt;br /&gt;
        bool = function (code, usage)&lt;br /&gt;
            return code == &amp;#039;lua&amp;#039;&lt;br /&gt;
        end,&lt;br /&gt;
        sub = {}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Message cache building.&lt;br /&gt;
    local msg = {}&lt;br /&gt;
&lt;br /&gt;
    for k, m in pairs(list) do&lt;br /&gt;
        if m.bool(code, usage) == true then&lt;br /&gt;
            msg[#msg+1] = i18n:inUserLang():msg{ key = k, args = m.sub }&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local notices = table.concat(msg, &amp;#039;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    if #msg &amp;gt; 1 then&lt;br /&gt;
        return &amp;#039;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;#039; .. notices .. &amp;#039;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return notices&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>Fandom&gt;KockaAdmiralac</name></author>
	</entry>
</feed>