The wiki is lacking in content. You can help by creating a new article. See the to do list for more ways you can help.

User:Lennethinian/sandbox/Module:Codename

From Final Fantasy Wiki
Jump to navigationJump to search

-- -------------------------------------------------------------------------------- -- This module calls information from releases and series by their Codename. -- Functions are invoked for use in various templates and for generation of -- site CSS. -- See [[Help:Codenames]] for details on how they are used. -------------------------------------------------------------------------------- local Codename = {} local getArgs = require('Dev:Arguments').getArgs local userError = require('Dev:User error') local printTable = require('Module:Table').tostring local uoTables = mw.loadData('Module:Codename/data') -------------------------------------------------------------------------------- -- Helper functions -------------------------------------------------------------------------------- -- For a dictionary t and list f, returns t[f[1]][f[2]][f[...]][f[#f]] or nil if -- any of those intermediate values are missing. -- -- @example -- dive({foo = {bar = {baz = 'hi'}}}, {'foo', 'bar', 'baz'}) --> 'hi' -- -- @TODO -- Move to [[Module:Table]] or something? It might be useful elsewhere... local function dive(t, f) for _, value in ipairs(f) do if type(t) ~= 'table' then return nil end t = t[value] end return t end -------------------------------------------------------------------------------- -- Database queries -------------------------------------------------------------------------------- Codename.tables = {} Codename.tables.odr = {} for key, value in pairs(uoTables) do Codename.tables[key] = {} Codename.tables.odr[key] = {} -- For use in modules for index, value2 in ipairs(value) do local id = value2.id -- Convert a list of tables with ids to a dictionary, where each key is -- an id, and each value is its corresponding table. -- -- ex. {{id='a'}, {id='b'}} --> {a={id='a'}, b={id='b'}} Codename.tables[key][id] = value2 -- Convert a list of tables with ids to a list of ids. -- -- ex. {{id='a'}, {id='b'}} --> {'a', 'b'} table.insert(Codename.tables.odr[key], id) end -- For use in wikitext via #invoke Codename[key] = function (frame) local args = getArgs(frame) local value = dive(Codename.tables[key], args) if type(value) == 'table' then return printTable(value) end return value end end -------------------------------------------------------------------------------- -- Generators for lists (for use on [[Help:Codename]], [[Project:Scope]], etc.) -------------------------------------------------------------------------------- -- Generates an ordered list of media. -- arg == 'rel' or 'ser'. -- optional info allows it to display some info from /data. function Codename._generator(dset, info) local list = mw.html.create('ul') local data = Codename.tables[dset] local odr = Codename.tables.odr[dset] local function addItem(node, elem, info) if not elem then return 'null' end local addedinfo = '' if info then addedinfo = ': (' .. elem[info] .. ')' end return node:tag('li') :wikitext('[[' .. elem.link .. "|''" .. elem.title .. "'']]" .. addedinfo) end for _, parent in ipairs(odr) do if not data[parent].sub then local item = addItem(list, data[parent], info) local sublist for _, child in ipairs(odr) do if data[child].sub == parent then if not sublist then sublist = item:tag('ul') end addItem(sublist, data[child], info) end end end end return list end function Codename.generator(frame) local args = getArgs(frame) return Codename._generator(args[1], args[2]) end -- Generate tables of all class colors function Codename.ctbl() local container = mw.html.create('div') :css('display', 'flex') :css('font-family', '\'Source Code Pro\',monospace') :css('text-align', 'center') local namedtbls = { ser = 'Series', rel = 'Releases' } for _, dset in ipairs{'ser', 'rel'} do local odr = Codename.tables.odr[dset] local tbl = container:tag('table') :addClass('article-table darktext mw-collapsible mw-collapsed') :attr('data-expandtext', 'Show ' .. #odr .. ' items') :attr('data-collapsetext', 'Hide ' .. #odr .. ' items') :css('width', '50%') :tag('tr') :css('background', '#F5F5F5') :css('font-style', 'italic') :tag('th') :attr('colspan', '7') :css('text-align', 'left') :wikitext(namedtbls[dset]) :done() :done() :tag('tr') :css('background', '#CCC') :tag('th') :attr('scope', 'col') :wikitext('Codename') :done() :tag('th') :attr('scope', 'col') :wikitext('Header') :done() :tag('th') :attr('scope', 'col') :wikitext('Subheader') :done() :done() for _, cname in ipairs(odr) do tbl:tag('tr') :tag('th') :attr('scope', 'row') :css('background', '#CCC') :css('font-style', 'italic') :wikitext('[[' .. Codename.tables[dset][cname].link .. '|' .. cname .. ']]') :done() :tag('td') :addClass(cname .. ' a') :wikitext(cname .. ' a') :done() :tag('td') :addClass(cname .. ' b') :wikitext(cname .. ' b') :done() end end return container end -- Generate table of all infobox and navbox theme headers function Codename.themebgtable() local odr = Codename.tables.odr['rel'] local tbl = mw.html.create('table') :addClass('article-table darktext mw-collapsible mw-collapsed') :attr('data-expandtext', 'Show ' .. #odr .. ' items') :attr('data-collapsetext', 'Hide ' .. #odr .. ' items') :css('font-family', '\'Source Code Pro\',monospace') :css('text-align', 'center') :tag('tr') :tag('th') :wikitext('Codename') :css('width', '50%') :done() :tag('th') :wikitext('Header') :css('width', '50%') :done() :done() for _, cname in ipairs(odr) do tbl:tag('tr') :tag('th') :wikitext(cname .. '<br>' .. '[[' .. Codename.tables['rel'][cname].link .. '|' .. Codename.tables['rel'][cname].title .. ']]') :done() :tag('td') :wikitext('[[' .. 'File:' .. cname .. ' theme header background.png|100px|' .. cname .. ']]') :done() :done() end return tbl end function Codename.themebgtable() local container = mw.html.create('div') :css('display', 'flex') :css('font-family', '\'Source Code Pro\',monospace') :css('text-align', 'center') local namedtbls = { ser = 'Series', rel = 'Releases' } for _, dset in ipairs{'ser', 'rel'} do local odr = Codename.tables.odr[dset] local tbl = container:tag('table') :addClass('article-table darktext mw-collapsible mw-collapsed') :attr('data-expandtext', 'Show ' .. #odr .. ' items') :attr('data-collapsetext', 'Hide ' .. #odr .. ' items') :css('width', '50%') :tag('tr') :css('background', '#F5F5F5') :css('font-style', 'italic') :tag('th') :attr('colspan', '7') :css('text-align', 'left') :wikitext(namedtbls[dset]) :done() :done() :tag('tr') :css('background', '#CCC') :tag('th') :attr('scope', 'col') :wikitext('Codename') :done() :tag('th') :attr('scope', 'col') :wikitext('Header') :done() :done() for _, cname in ipairs(odr) do if Codename.tables[dset][cname]['theme'] then tbl:tag('tr') :tag('th') :wikitext(cname .. '<br>' .. '[[' .. Codename.tables[dset][cname].link .. '|' .. Codename.tables[dset][cname].title .. ']]') :done() :tag('td') :wikitext('[[' .. 'File:' .. cname .. ' theme header background.png|100px|' .. cname .. ']]') :done() :done() end end end return container end return Codename --