Module:UniverseData: Difference between revisions
Jump to navigation
Jump to search
Content added Content deleted
No edit summary |
No edit summary |
||
Line 126: | Line 126: | ||
end |
end |
||
if t.au == "True" then |
if t.au == "True" then |
||
if canon == |
if canon == {} then |
||
s = s .. "{{Alternate Universe lore}}" |
s = s .. "{{Alternate Universe lore}}" |
||
end |
end |
Revision as of 14:14, 16 June 2023
- Module:UniverseData has the following documentation.
This Module handles all League of Legends Universe media and fetches related lore entries and categories for various purposes. It also facilitates the sorting and formatting of lore templates:
- Template:Lore banner uses
getBanner
- Template:Lore header uses
getCategories
- Template:More lore uses
getMore
- Template:Lore feature uses
getFeature
(template itself is currently unused in favor of the above)
The data is stored at Module:UniverseData/data. If you wish to edit that data, please follow the format documented at the top of that page.
-- <pre>
--[[
Key
reference string
author string
artwork string
starring table
mentioned table
region table
loretype string | Biography, Comic, Game, Faction, Short Story, Video
duration number
description string
previous string
following string | (note: 'next' is a reserved word)
au string | if alternative universe stuff set to "True"
status string | if outdated set to "Outdated"
]]
--[[
Used in
Template:Lore banner getBanner
Template:Lore header getCategories
Template:More lore getMore
Template:Lore feature getFeature
]]
local p = {}
local loreData = mw.loadData('Module:UniverseData/data')
local lib = require('Module:Feature')
local FN = require('Module:Filename')
local builder = require("Module:SimpleHTMLBuilder")
function p.loreTemplate(frame)
local args = lib.frameArguments(frame)
local loretypeArg = args["type"] or "Short Story";
local loreList = ''
local lore = {}
for x in pairs(loreData) do
table.insert(lore, x)
end
table.sort(lore)
for _, piece in pairs(lore) do
local t = loreData[piece]
local loretype = t.loretype or "N/A"
local starring = t.starring
local entry = ''
if starring and (args["starring"] == nil or lib.string_to_bool(args["starring"])) then
entry = '* [[' .. piece .. '|' .. piece .. ']] <small>('.. getChampions(starring) ..')</small>\n'
else
entry = '* [[' .. piece .. '|' .. piece .. ']]\n'
end
if loretype == loretypeArg then
loreList = loreList .. entry
end
end
return loreList
end
function p.getLoreTypes()
local loreList = builder.create('ul')
local lore = {}
local res = {}
for x in pairs(loreData) do
table.insert(lore, x)
end
table.sort(lore)
for _, piece in pairs(lore) do
local t = loreData[piece]
local loretype = t.loretype or "N/A"
if not lib.in_array(res, loretype) then
table.insert(res, loretype)
loreList
:tag('li')
:tag('div')
:wikitext(loretype)
:done()
:done()
:newline()
end
end
return loreList
end
function p.getBanner(frame)
local args = lib.frameArguments(frame)
return banner(args["title"], args["footer"] or "true")
end
function p.getFeature(frame)
local args = lib.frameArguments(frame)
return feature(args["title"], args["footer"] or "true")
end
function p.getCategories(frame)
local args = lib.frameArguments(frame)
local s = ""
local t = loreData[args[1]] or loreData["Something Went Wrong"]
local loretype = t.loretype or nil
local starring = t.starring or {}
local mentioned = t.mentioned or {}
local region = t.region or {}
local canon = t.status or {}
local count = 0
if canon == "Legacy" then
s = s .. "[[Category:Old lore]][[Category:Runeterra Legacy]]"
s = s .. "{{Old lore}}"
else
if canon == "Debatable" then
s = s .. "[[Category:Debatable Canon lore]]"
s = s .. "<table style='' class='plainlinks ambox ambox-green'><tr><td class='ambox-image'>[[File:Oops Emote.png|65px|link=]]</td><td class='ambox-info' style='line-height: 1.5em;'><i>\"Paradoxes. I hate those guys.\"</i><ul><li> This story is no longer considered to be [[Runeterra Prime|main lore]] canon, but exists here for reference purposes.</li></ul></td></tr></table>"
end
end
if t.au == "True" then
if canon == {} then
s = s .. "{{Alternate Universe lore}}"
end
if loretype ~= nil then
if loretype == "Video" then
s = s .. "[[Category:Alternate Universe Video]]"
elseif loretype == "Comic" then
s = s .. "[[Category:Alternate Universe Comic]][[Category:" .. args[1] .. "]]"
elseif loretype == "Game" then
s = s .. "[[Category:Alternate Universe Game]][[Category:" .. args[1] .. "]]"
else
s = s .. "[[Category:Alternate Universe " .. loretype .. "]]"
end
end
else
if region ~= nil then
for i, region in pairs(region) do
s = s .. "[[Category:Lore of " .. region .. "]]"
end
else
s = s .. "[[Category:Lore with no regional setting]]"
end
if loretype ~= nil then
if loretype == "Video" then
s = s .. "[[Category:Video lore]]"
elseif loretype == "Comic" then
s = s .. "[[Category:Comic]][[Category:" .. args[1] .. "]]"
elseif loretype == "Comic" then
s = s .. "[[Category:Lore games]][[Category:" .. args[1] .. "]]"
else
s = s .. "[[Category:" .. loretype .. "]]"
end
end
end
for i, champion in pairs(starring) do
s = s .. "[[Category:" .. champion .. " lore]]"
count = count + 1
end
for i, champion in pairs(mentioned) do
s = s .. "[[Category:" .. champion .. " lore]]"
end
if count == 0 then
s = s .. "[[Category: Lore with no starring champion]]"
end
return frame:preprocess(s)
end
function p.getAuthor(frame)
local args = lib.frameArguments(frame)
return loreData[args[1]].author or {"Unknown Author"}
end
function p.getAuthorlist()
local authors = {}
local hash = {}
local authorList = builder.create('ul')
authorList:newline()
for _, x in pairs(loreData) do
if x.author ~= nil then
for _, value in pairs(x.author) do
if (not hash[value]) then
table.insert(authors, value)
hash[value] = true
end
end
end
end
table.sort(authors)
for _, author in pairs(authors) do
authorList
:tag('li')
:wikitext('[[' .. author .. ']]')
:done()
:newline()
end
return authorList
end
function p.getReference(frame)
local args = lib.frameArguments(frame)
return loreData[args[1]].reference or "https://universe.leagueoflegends.com/en_US/"
end
function p.getArtwork(frame)
local args = lib.frameArguments(frame)
return loreData[args[1]].artwork or "Bard promo 2.jpg"
end
function p.getLorelist(frame)
local loreList = builder.create('ul')
local lore = {}
for x in pairs(loreData) do
table.insert(lore, x)
end
table.sort(lore)
for _, piece in pairs(lore) do
local t = loreData[piece]
local link = piece
local name = piece
local loretype = t.loretype or "N/A"
if loretype == "Biography" then
link = t.starring[1]
end
loreList
:tag('li')
:tag('div')
:wikitext('[[' .. link .. '|' .. name .. ']] ('.. loretype ..')')
:done()
:done()
:newline()
end
return loreList
end
function p.getMore(frame)
local args = lib.frameArguments(frame)
local champion = args[1]
local article = ""
local bioList = ""
local loreList = ""
local mentionedList = ""
local auList = ""
local removedList = ""
local lore = {}
for x in pairs(loreData) do
table.insert(lore, x)
end
table.sort(lore)
loreList = loreList .. "<h3>Starring Champion</h3>"
for _, piece in pairs(lore) do
local hit = false
local t = loreData[piece]
if t.starring ~= nil and t.loretype ~= "Faction" and t.loretype ~= "Universe" then
for _, substarring in pairs(t.starring) do
if substarring == champion then
hit = true
end
end
end
if hit == true then
if t.status == "Outdated" then
removedList = removedList .. banner(piece, "false")
else
if t.au ~= "True" then
if t.loretype == "Biography" then
bioList = bioList .. banner(piece, "false")
else
loreList = loreList .. banner(piece, "false")
end
else
auList = auList .. banner(piece, "false")
end
end
end
end
for _, piece in pairs(lore) do
local hit = false
local t = loreData[piece]
if t.mentioned ~= nil then
for _, submentioned in pairs(t.mentioned) do
if submentioned == champion then
hit = true
end
end
end
if hit == true then
if t.status == "Outdated" then
removedList = removedList .. banner(piece, "false")
else
if t.au ~= "True" then
mentionedList = mentionedList .. banner(piece, "false")
else
auList = auList .. banner(piece, "false")
end
end
end
end
if bioList ~= "" then
article = article .. "<h3>Biography</h3>"
article = article .. bioList
end
article = article .. loreList
if mentionedList ~= "" then
article = article .. "\n<div class='va-collapsible-content mw-collapsible mw-collapsed' data-expandtext='show' data-collapsetext='hide'><h3>Mentioned Champion</h3><div class='va-collapsible-content mw-collapsible-content'>" .. mentionedList .. "</div></div>"
end
if auList ~= "" then
article = article .. "\n<div class='va-collapsible-content mw-collapsible mw-collapsed' data-expandtext='show' data-collapsetext='hide'><h3>Alternate Universes</h3><div class='va-collapsible-content mw-collapsible-content'>" .. auList .. "</div></div>"
end
if removedList ~= "" then
article = article .. "\n<div class='va-collapsible-content mw-collapsible mw-collapsed' data-expandtext='show' data-collapsetext='hide'><h3>Outdated Lore</h3><div class='va-collapsible-content mw-collapsible-content'>" .. removedList .. "</div></div>"
end
return article
end
function p.getRegionlore(frame)
local args = lib.frameArguments(frame)
local loreList = ""
local lore = {}
local result = false
for x in pairs(loreData) do
table.insert(lore, x)
end
table.sort(lore)
for _, piece in pairs(lore) do
local hit = false
local t = loreData[piece]
if (t.region ~= nil) then
for _, subregion in pairs(t.region) do
if subregion == args[1] then
hit = true
result = true
end
end
else
if args[1] == "Runeterra" then
hit = true
result = true
end
end
if hit == true then
loreList = loreList .. banner(piece, "false")
end
end
if result == false then
loreList = "No match found for " .. args[1] .. "."
end
return loreList .. "[[Category:Test]]"
end
function p.getDescription(frame)
local args = lib.frameArguments(frame)
return loreData[args[1]].description or "Description not specified."
end
function p.getDuration(frame)
local args = lib.frameArguments(frame)
return loreData[args[1]].duration or "Duration not specified."
end
function p.getLoretype(frame)
local args = lib.frameArguments(frame)
return loreData[args[1]].loretype or "Loretype not specified."
end
function p.getMentioned(frame)
local args = lib.frameArguments(frame)
if loreData[args[1]].mentioned == nil then
return "N/A"
else
return getChampions(loreData[args[1]].mentioned)
end
end
function p.getRegion(frame)
local args = lib.frameArguments(frame)
if loreData[args[1]].region == nil then
return "Runeterra"
else
return lib.tbl(loreData[args[1]].region)
end
end
function p.getStarring(frame)
local args = lib.frameArguments(frame)
if loreData[args[1]].starring == nil then
return "N/A"
else
return getChampions(loreData[args[1]].starring)
end
end
function p.getTest(frame)
local args = lib.frameArguments(frame)
return "{{User:Emptylord/Lore/Banner|" .. args[1] .. "}}"
end
function p.getPrevious(frame)
local args = lib.frameArguments(frame)
return loreData[args[1]].previous or nil
end
function p.getFollowing(frame)
local args = lib.frameArguments(frame)
return loreData[args[1]].following or nil
end
function p.getNarration(frame)
local args = lib.frameArguments(frame)
return loreData[args[1]].narration or nil
end
-- local functions
function banner(name, footer)
local piece = loreData[name] or loreData["Something Went Wrong"]
local s = ""
local ret = builder.create("div")
local bName = piece.altname or name
local artwork = piece.artwork or "Bard promo 2.jpg"
local author = piece.author or {"Unknown Author"}
local reference = piece.reference or "https://universe.leagueoflegends.com/en_US/"
local link = name
local region = "Runeterra"
local duration = piece.duration or "0"
local starring = "N/A"
local mentioned = "N/A"
local canon = piece.status or ""
local loretype = piece.loretype or ""
local description = piece.description or ""
local narration = piece.narration or ""
local narfooter = footer or "false"
--if loretype == "Biography" then link = piece.starring[1] end
if piece.region ~= nil then region = piece.region[1] end
if piece.starring ~= nil then starring = getChampions(piece.starring) end
if piece.mentioned ~= nil then mentioned = getChampions(piece.mentioned) end
if loretype == "Universe" then
link = link .. " (Universe)"
end
local temp = ret
:attr("id", "champinfo-container")
:css("width", "100%")
:css("min-height", "130px")
:css("max-height", "500px")
:css("overflow", "hidden")
:css("position", "relative")
:css("font-size", "14px")
:css("display", "flex")
:css("z-index", "0")
:tag("div")
:addClass("FillImage")
:css("width", "100%")
:css("height", "100%")
:css("position", "absolute")
:css("top","0")
:css("left", "0")
:css("opacity", "0.3")
:css("z-index", "0")
:wikitext("[[File:" .. artwork .."|link=]]")
:done()
if piece.previous ~= nil then
temp = temp
:tag("div")
:css("position", "absolute")
:css("left", "0")
:css("width", "10%")
:css("height", "100%")
:addClass("universe-banner-nav")
if loreData[piece.previous] ~= nil then
temp = temp
:tag("div")
:addClass("universe-banner-nav-item")
:css("position", "absolute")
:css("left", "0")
:css("width", "200%")
:css("height", "100%")
:css("mask-image", "linear-gradient(to right, rgba(0, 0, 0, 1) 60%, transparent);")
:css("-webkit-mask-image", "linear-gradient(to right, rgba(0, 0, 0, 1) 60%, transparent);")
:tag("div")
:addClass("FullWidth")
:css("position", "absolute")
:css("left", "50%")
:wikitext("[[File:" .. loreData[piece.previous].artwork .. "|x600px|link=" .. piece.previous .. "]]")
:done()
:done()
end
temp = temp
:tag("div")
:css("position","absolute")
:css("top", "50%")
:css("left", "0.4em")
:css("font-size", "3em")
:addClass("basic-tooltip")
:attr("title", piece.previous)
:wikitext("[[" .. piece.previous .. "|⮜]]")
:done()
temp = temp
:done()
end
if piece.following ~= nil then
temp = temp
:tag("div")
:css("position", "absolute")
:css("right", "0")
:css("width", "10%")
:css("height", "100%")
:addClass("universe-banner-nav")
if loreData[piece.following] ~= nil then
temp = temp
:tag("div")
:addClass("universe-banner-nav-item")
:css("position", "absolute")
:css("right", "0")
:css("width", "200%")
:css("height", "100%")
:css("mask-image", "linear-gradient(to left, rgba(0, 0, 0, 1) 60%, transparent);")
:css("-webkit-mask-image", "linear-gradient(to left, rgba(0, 0, 0, 1) 60%, transparent);")
:tag("div")
:addClass("FullWidth")
:css("position", "absolute")
:css("left", "50%")
:wikitext("[[File:" .. loreData[piece.following].artwork .. "|x600px|link=" .. piece.following .. "]]")
:done()
:done()
end
temp = temp
:tag("div")
:css("position","absolute")
:css("top", "50%")
:css("right", "0.4em")
:css("font-size", "3em")
:addClass("basic-tooltip")
:attr("title", piece.following)
:wikitext("[[" .. piece.following .. "|⮞]]")
:done()
temp = temp
:done()
end
temp = temp
:tag("sup")
:css("position", "absolute")
:css("top", "1em")
:css("right", "1em")
:css("z-index", "2")
:tag("span")
:addClass("plainlinks")
:wikitext("[https://leagueoflegends.wikia.com/wiki/Module:UniverseData/data?action=edit Edit]")
:done()
:wikitext(" • [[:File:" .. artwork .."|Image]] • [" .. reference.. " Reference]")
if narfooter == "false" and narration ~= "" then
temp
:wikitext("<br/>[[File:Actor.png|link=File:" .. narration .. "|24px]][[:File:" .. narration .. "|Listen to this article.]]")
end
temp = temp:done()
temp = temp
:tag("div")
:css("text-align", "center")
:css("max-width", "80%")
:css("margin", "auto")
:css("z-index", "1")
:tag("div")
:css("margin", "3em 0")
:tag("p")
:attr("id", "title")
:css("margin", "4em 0 0 0")
:wikitext("[[File:" .. region .. " Crest icon.png|x56px|link=" .. region .."]]")
:done()
if loretype == "Short Story" then
temp = temp:tag("p"):attr("id", "duration"):css("margin","0")
if duration == "0" then
temp = temp:wikitext("Short Story")
else
temp = temp:wikitext("Short Story • " .. duration .." Minute Read")
end
temp = temp:done()
else
temp = temp:tag("p"):attr("id", "duration"):css("margin", "0"):wikitext(loretype):done()
end
temp = temp
:tag("p")
:attr("id", "title")
:css("font-size", "250%")
:css("line-height", "100%")
:css("margin", "0")
:css("color", "#c9aa71")
:wikitext("[[" .. link .. "|" .. bName .."]]")
:done()
if loretype ~= "Video" then
local s = "By "
for i, value in ipairs(author) do
if i ~= 1 then
s = s .. ", "
end
if value == "Unknown Author" or value == "Numerous creators" then
s = s .. value
else
s = s .. "[[" .. value .. "]]"
end
end
temp = temp
:tag("p")
:attr("id","duration")
:css("margin", "0 0 1em 0")
:wikitext(s)
:done()
end
if loretype ~= "Biography" then
temp = temp
:tag("p")
:attr("id", "blurb")
:css("margin", "1em 0 1em 0")
:css("font-size", "13px")
:css("text-transform", "initial")
:css("line-height", "1.6")
:css("text-shadow", "black 1px 1px")
:wikitext((description:gsub("//n", "<br/>")))
:done()
end
if starring ~= nil then
temp = temp
:tag("p")
:attr("id", "featured")
:css("margin", "0 0 1em 0")
:wikitext("Starring: " .. starring)
:done()
end
if mentioned ~= "N/A" then
temp = temp
:tag("p")
:attr("id", "featured")
:css("margin", "0 0 1em 0")
:wikitext("Mentioned: " .. mentioned)
:done()
end
temp = temp:done()
--/content
temp = temp:done()
if narfooter == "true" and narration ~= "" then
temp = temp:tag("div"):attr("id", "champinfo-container"):css("position", "relative"):css("height", "calc(36px + 2em)"):css("width", "100%"):css("overflow", "hidden"):css("background", "#010a13"):css("text-align", "center"):tag("div"):css("margin-top", "1em")
:wikitext("[[File:Actor.png|36px|link=File:" .. narration .. "]] [[:File:" .. narration .. "|LISTEN TO THIS ARTICLE]]"):done():done()
end
return tostring(ret:allDone())
end
function feature(name, footer)
local piece = loreData[name] or loreData["Something Went Wrong"]
local s = ""
local bName = piece.altname or name
local artwork = piece.artwork or "Bard promo 2.jpg"
local author = piece.author or {"Unknown Author"}
local reference = piece.reference or "https://universe.leagueoflegends.com/en_US/"
local link = name
local region = "Runeterra"
local duration = piece.duration or "0"
local starring = "N/A"
local mentioned = "N/A"
local canon = piece.status or ""
local loretype = piece.loretype or ""
local description = piece.description or ""
local narration = piece.narration or ""
local narfooter = footer or "false"
if loretype == "Biography" then link = piece.starring[1] end
if piece.region ~= nil then region = piece.region[1] end
if piece.starring ~= nil then starring = getChampions(piece.starring) end
if piece.mentioned ~= nil then mentioned = getChampions(piece.mentioned) end
s = s .. "<div id='champinfo-container' style='width:100%; min-height: 310px; overflow:hidden; position:relative; font-size:14px; color: #dddddd; display:flex;'><div style='margin:0 auto;'>"
--edit
s = s .. "<sup style='position: absolute; top: 1em; right: 1em; z-index:2'><span class='plainlinks'>[https://leagueoflegends.wikia.com/wiki/Module:UniverseData/data?action=edit Edit]</span> • [[:File:" .. artwork .."|Image]] • [" .. reference.. " Reference]"
if narfooter == "false" and narration ~= "" then
s = s .. "<br/>[[File:Actor.png|link=File:" .. narration .. "|24px]][[:File:" .. narration .. "|Listen to this article.]]"
end
s = s .. "</sup>"
--/edit
--content
s = s .. "<div style='text-align:center; max-width: 80%; z-index:1'><div style='margin:3em 0'>"
s = s .. "<p id='title' style='margin:4em 0 0 0;'>[[File:" .. region .. " Crest icon.png|x56px|link=" .. region .."]]</p>"
if loretype == "Short Story" then
if duration == "0" then
s = s .. "<p id='duration' style='margin:0;'> Short Story </p>"
else
s = s .. "<p id='duration' style='margin:0;'> Short Story • " .. duration .." Minute Read</p>"
end
else
s = s .. "<p id='duration' style='margin:0;'>" .. loretype .. "</p>"
end
if piece.previous ~= nil then
s = s .. "<div style='position: absolute; top: 50%; left:0.4em; font-size:3em;' class='basic-tooltip' title='" .. piece.previous .. "'>[[" .. piece.previous .. "|⮜]]</div>"
end
s = s .. "<p id='title' style='font-size:250%; line-height:100%; margin:0;color:#c9aa71;'>[[" .. link .. "|" .. bName .."]]</p>"
if loretype ~= "Video" then
s = s .. "<p id='duration' style='margin:0 0 1em 0;'> By "
for i, value in ipairs(author) do
if i ~= 1 then
s = s .. ", "
end
if value == "Unknown Author" or value == "Numerous creators" then
s = s .. value
else
s = s .. "[[" .. value .. "]]"
end
end
s = s .. "</p>"
end
if piece.following ~= nil then
s = s .. "<div style='position: absolute; top: 50%; right: 0.4em; font-size:3em;' class='basic-tooltip' title='" .. piece.following .. "'>[[" .. piece.following .. "|⮞]]</div>"
end
if loretype ~= "Biography" then
s = s .. "<p id='blurb' style='margin:1em 0 1em 0; font-size: 89%; text-transform: initial; text-shadow:black 1px 1px;'>" .. description:gsub("//n", "<br/>") .."</p>"
end
if starring ~= nil and loretype ~= "Biography" then
s = s .. "<p id='featured' style='margin:0 0 1em 0;'>Starring: " .. starring .. "</p>"
end
if mentioned ~= "N/A" then
s = s .. "<p id='featured' style='margin:0 0 1em 0;'>Mentioned: " .. mentioned .. "</p>"
end
--image
s = s .. "<div class='FillImage fxaa' style='width:25%; position:relative; margin: auto 0;'>[[File:" .. artwork .."|link=]]</div>"
--/image
s = s .. "</div></div>"
--/content
s = s .. "</div></div>"
if narfooter == "true" and narration ~= "" then
s = s .. "<div id='champinfo-container' style='position:relative; height:calc(36px + 2em); width: 100%; overflow:hidden; background:#010a13; text-align:center;'><div style='margin-top:1em;'>[[File:Actor.png|36px|link=File:" .. narration .. "]] [[:File:" .. narration .. "|LISTEN TO THIS ARTICLE]]</div></div>"
end
return s
end
function getChampions(t)
local s = ""
local championtable = {}
for i, champion in pairs(t) do
table.insert(championtable, champion)
end
table.sort(championtable)
for i, champion in pairs(championtable) do
if i ~= 1 then
s = s .. ", "
end
s = s .. "<span style='white-space:nowrap'>[[File:" .. champion .. "Square.png|20px|link=" .. champion .. "]] [[" .. champion .. "|" .. champion .."]]</span>"
end
return s
end
return p
-- </pre>
-- [[Category:Lua]]