Module:Vooruitgangen
Naar navigatie springen
Naar zoeken springen
Deze module slaat data op in en haalt data uit Semantic MediaWiki. De volgende eigenschap wordt gebruikt:
Deze module implementeert {{Vooruitgangen}}
en {{Laad vooruitgangen}}
. Wanneer het eerste sjabloon wordt aangeroepen, wordt de vooruitgang toegevoegd aan Semantic MediaWiki.
Afhankelijkheden[brontekst bewerken]
- Module:ProcessArgs
{{Anchor}}
{{EnvSprite}}
{{InvSprite}}
{{ItemSprite}}
{{Vooruitgang}}
Zie ook[brontekst bewerken]
[bekijken | bewerken | geschiedenis | cache legen]Bovenstaande documentatie is getranscludeerd uit Module:Vooruitgangen/doc.
local p = {}
local i18n = {
moduleArgs = 'Module:ProcessArgs',
advancementTemplate = 'Vooruitgang',
anchorTemplate = 'Anchor',
envSpriteTemplate = 'EnvSprite',
invSpriteTemplate = 'InvSprite',
itemSpriteTemplate = 'ItemSprite',
advancementsPage = 'Vooruitgangen',
uncategorized = 'Niet gecategoriseerd',
advancementsProblemCategory = 'Categorie:Vooruitgangsproblemen',
advancementsDefaultName = 'Naam van vooruitgang ontbreekt',
advancementsCategorizeNameMissing = 'N',
advancementsDefaultBackground = 'normaal',
advancementsDefaultImage = 'Grasblok',
advancementsDefaultDescription = 'Beschrijving ontbreekt',
advancementsCategorizeDescriptionMissing = 'B',
advancementsDefaultPredecessor = '—',
advancementsDefaultActualRequirements = '—',
advancementsDefaultId = '—',
advancementsDefaultPrize = '—',
advancementsHeaderImage = 'Afbeelding',
advancementsHeaderAdvancement = '[[$1|Vooruitgang]]',
advancementsHeaderDescription = 'Beschrijving in het spel',
advancementsHeaderPredecessor = 'Voorgaande vooruitgang',
advancementsHeaderActualRequirements = 'Eigenlijke vereisten (bij verschil)',
advancementsHeaderId = 'Technische naam',
advancementsHeaderPrize = 'Beloning',
advancementJsonPrefix = 'Advancement JSON: ',
smwStorageErrorText = 'Fout bij opslaan van SMW-data',
advancementsNoTitleGiven = 'Geen te laden vooruitgangen opgegeven.',
advancementsNoneFound = 'Geen vooruitgangen gevonden.',
advancementsNoneSpecificFound = 'Geen vooruitgang met naam "$1" gevonden.'
}
local variablesLua = mw.ext.VariablesLua
local function createHeader( headerOption, prize, extensiveHeader, sortable, f )
local tableHeaderHtml = {}
local tableOpening = '<table class="wikitable '
if sortable then
tableOpening = tableOpening .. 'sortable jquery-tablesorter'
end
tableOpening = tableOpening .. '">'
table.insert( tableHeaderHtml, tableOpening )
if extensiveHeader then
local headerTextOptions = {
['minecraft'] = f:expandTemplate{ title = i18n.envSpriteTemplate, args = { 'bovenwereld', text = 'Minecraft' } },
['root'] = f:expandTemplate{ title = i18n.envSpriteTemplate, args = { 'bovenwereld', text = 'Minecraft' } },
['nether'] = f:expandTemplate{ title = i18n.envSpriteTemplate, args = { 'nether', text = 'Nether' } },
['end'] = f:expandTemplate{ title = i18n.envSpriteTemplate, args = { 'end', text = 'De End' } },
['adventure'] = f:expandTemplate{ title = i18n.itemSpriteTemplate, args = { 'lege-kaart', text = 'Avontuur' } },
['avontuur'] = f:expandTemplate{ title = i18n.itemSpriteTemplate, args = { 'lege-kaart', text = 'Avontuur' } },
['husbandry'] = f:expandTemplate{ title = i18n.invSpriteTemplate, args = { 'Hooibaal', text = 'Agricultuur', scale = 0.5 } },
['agricultuur'] = f:expandTemplate{ title = i18n.invSpriteTemplate, args = { 'Hooibaal', text = 'Agricultuur', scale = 0.5 } },
['default'] = i18n.uncategorized
}
local colspan = prize and 7 or 6
local extensiveHeaderHtml = mw.html.create( 'tr' )
extensiveHeaderHtml:tag( 'th' )
:addClass( 'unsortable' )
:attr( 'colspan', colspan ):attr( 'scope', 'col' )
:wikitext( headerTextOptions[headerOption] or headerTextOptions['default'] )
table.insert( tableHeaderHtml, tostring( extensiveHeaderHtml ) )
end
local headerHtml = mw.html.create( 'tr' )
local advancementsHeaderText = i18n.advancementsHeaderAdvancement:gsub( '%$1', i18n.advancementsPage )
-- Advancement picture
headerHtml:tag( 'th' )
:addClass( 'unsortable' )
:attr( 'scope', 'col' )
:wikitext( i18n.advancementsHeaderImage )
:done()
-- Name
:tag( 'th' )
:attr( 'scope', 'col' )
:wikitext( advancementsHeaderText )
:done()
-- Description
:tag( 'th' )
:attr( 'scope', 'col' )
:wikitext( i18n.advancementsHeaderDescription )
:done()
-- Predecessor
:tag( 'th' )
:attr( 'scope', 'col' )
:wikitext( i18n.advancementsHeaderPredecessor )
:done()
-- Actual requirements
:tag( 'th' )
:attr( 'scope', 'col' )
:wikitext( i18n.advancementsHeaderActualRequirements )
:done()
-- ID
:tag( 'th' )
:attr( 'scope', 'col' )
:wikitext( i18n.advancementsHeaderId )
:done()
-- Prize, if applicable
if prize then
headerHtml:tag( 'th' )
:attr( 'scope', 'col' )
:wikitext( i18n.advancementsHeaderPrize )
:done()
-- Set prize variable
variablesLua.vardefine( 'advancements_prize', '1' )
end
headerHtml:allDone()
table.insert( tableHeaderHtml, tostring( headerHtml ) )
return table.concat( tableHeaderHtml, '' )
end
local function createRow(
category, image, background, title,
description, predecessor, actualRequirements, technicalName,
prize, upcoming, aUntil,
link, anchor, f
)
-- Check the required parameters first
title = title or i18n.advancementsDefaultName -- For now just the bare missing title string. Later it'll be formatted
if not description then
description = '<strong style="color:red">' .. i18n.advancementsDefaultDescription .. '</strong>' .. '[[' .. i18n.advancementsProblemCategory .. '|' .. i18n.advancementsCategorizeDescriptionMissing .. ']]'
end
-- Create the row HTML element
local rowHtml = mw.html.create( 'tr' )
-- Advancement image
local advancementImage = f:expandTemplate{ title = i18n.advancementTemplate, args = { image or i18n.advancementsDefaultImage, background or i18n.advancementsDefaultBackground, link = link } }
local anchorTemplate = ''
if anchor then
anchorTemplate = f:expandTemplate{ title = i18n.anchorTemplate, args = { title } }
end
rowHtml:tag( 'td' )
:css( 'text-align', 'center' )
:wikitext( advancementImage .. anchorTemplate )
:done()
-- Title; we will ignore {{upcoming}} and {{until}} for now
local styledTitle = title
if styledTitle == i18n.advancementsDefaultName then
styledTitle = '<strong style="color:red">' .. styledTitle .. '</strong>' .. '[[' .. i18n.advancementsProblemCategory .. '|' .. i18n.advancementsCategorizeNameMissing .. ']]'
else
styledTitle = '<strong>' .. styledTitle .. '</strong>'
end
rowHtml:tag( 'td' )
:css( 'text-align', 'center' )
:wikitext( styledTitle )
:done()
-- Description
rowHtml:tag( 'td' )
:wikitext( description )
:done()
-- Predecessor
predecessor = predecessor or i18n.advancementsDefaultPredecessor
rowHtml:tag( 'td' )
:wikitext( predecessor )
:done()
-- Actual requirements
actualRequirements = actualRequirements or i18n.advancementsDefaultActualRequirements
rowHtml:tag( 'td' )
:wikitext( actualRequirements )
:done()
-- ID
local parsedTechnicalName = ''
if technicalName then
parsedTechnicalName = '<code>' .. technicalName .. '</code>'
else
parsedTechnicalName = i18n.advancementsDefaultId
end
rowHtml:tag( 'td' )
:wikitext( parsedTechnicalName )
:done()
-- Prize, if applicable. We need to define it anyway if not, for SMW
prize = prize or i18n.advancementsDefaultPrize
if variablesLua.var( 'advancements_prize' ) == '1' then
rowHtml:tag( 'td' )
:wikitext( prize )
:done()
end
rowHtml:allDone()
-- Create table with all values for JSON
local advancementJson = {
category = category,
image = image,
background = background,
title = title,
description = description,
predecessor = predecessor ~= i18n.advancementsDefaultPredecessor and predecessor or false,
actual_requirements = actualRequirements ~= i18n.advancementsDefaultActualRequirements and actualRequirements or false,
id = technicalName ~= i18n.advancementsDefaultId and technicalName or false,
prize = prize ~= i18n.advancementsDefaultPrize and prize or false,
}
return tostring( rowHtml ), advancementJson
end
local function addSmw( unprocessedJson, store )
local advancementJson = mw.text.jsonEncode( unprocessedJson )
local smwError = nil
if store then
local smwmap = {
-- The commented properties will only really be necessary if each advancement has its own page.
-- ['Is in advancement category'] = unprocessedJson.category,
-- ['Has advancement image'] = unprocessedJson.image,
-- ['Has advancement background'] = unprocessedJson.background,
-- ['Has advancement title'] = unprocessedJson.title,
-- ['Has advancement description'] = unprocessedJson.description,
-- ['Has advancement predecessor'] = unprocessedJson.predecessor,
-- ['Has actual advancement requirement'] = unprocessedJson.actual_requirements,
-- ['Has advancement ID'] = unprocessedJson.id,
-- ['Has advancement prize'] = unprocessedJson.prize,
['Advancement JSON'] = advancementJson
}
local smwResult = mw.smw.set( smwmap )
if smwResult ~= true then
smwError = i18n.smwStorageErrorText .. ':' .. smwResult.error
end
end
local jsonHtml = mw.html.create( 'div' )
jsonHtml:addClass( 'advancement-smw-data' )
:cssText( 'display:none' )
if smwError then
jsonHtml:tag( 'span' ):wikitext( i18n.advancementJsonPrefix .. smwError )
else
jsonHtml:tag( 'span' ):wikitext( i18n.advancementJsonPrefix .. advancementJson )
end
jsonHtml:allDone()
return tostring( jsonHtml )
end
local function closeTable()
variablesLua.vardefine( 'advancements_prize', '' ) -- Unset the prize variable
return '</table>'
end
--[[
Stores and displays the advancements on the advancements page in a table
]]--
function p.store( f )
local args = f
if f == mw.getCurrentFrame() then
args = require( i18n.moduleArgs ).merge( true )
else
f = mw.getCurrentFrame()
end
local htmlElements = {}
-- Header
if args.head then
table.insert( htmlElements, createHeader( args.category, args.prize, true, true, f ) )
end
-- Advancement rows
local advancementRow, advancementJson = createRow(
-- Follows the formatting of createRow()'s parameters
args.category, args[1], args.bg, args.title,
args[2], args[3], args[4], args[5],
args[6], args.toekomstig, args.tot,
nil, true, f
)
table.insert( htmlElements, advancementRow )
-- Store JSON in SMW
local title = mw.title.getCurrentTitle()
local storeAdvancement = true
if (args.nocat == '1' or title.namespace ~= 0 or title.isSubpage) and args.forcecat ~= '1' then
storeAdvancement = false
end
local smwResult = addSmw( advancementJson, storeAdvancement )
table.insert( htmlElements, smwResult )
-- Add closing table element
if args.foot then
table.insert( htmlElements, closeTable() )
end
return table.concat( htmlElements, '' )
end
--[[
Loads the given advancements and displays them in a table
]]--
function p.load( f )
local args = f
if f == mw.getCurrentFrame() then
args = require( i18n.moduleArgs ).merge( true )
else
f = mw.getCurrentFrame()
end
-- Check if advancements have been specified
if not args[1] then
return '<strong style="color:red">' .. i18n.advancementsNoTitleGiven .. '</strong>'
end
-- As all advancements are 'stored' on one page, request all advancements up front
local smwQuery = {
'[[Advancement JSON::+]]',
'?=#',
'?Advancement JSON',
limit = 250
}
local smwResult = mw.smw.ask( smwQuery )
if not smwResult or #smwResult == 0 then
return '<strong style="color:red">' .. i18n.advancementsNoneFound .. '</strong>'
end
-- Split wanted advancements at the semicolon
local wantedAdvancements = mw.text.split( args[1], ';' )
local foundAdvancements = {} -- tracker table
-- Prefill foundAdvancementsJson in case one isn't found
local foundAdvancementsJson = {}
for i=1,#wantedAdvancements do
foundAdvancementsJson[i] = false
end
-- Will be set to true if an advancement gives a prize
local hasPrize = false
-- Loop through the advancements
for _,smwSubresult in ipairs( smwResult ) do
-- Shortcut the main loop if the length of wantedAdvancements and
-- foundAdvancements is the same
if #wantedAdvancements == #foundAdvancements then
break
end
for _,advancement in pairs( smwSubresult['Advancement JSON'] ) do
local decodedJson = mw.text.jsonDecode( advancement )
for i,v in ipairs( wantedAdvancements ) do
if decodedJson['title'] == v then
-- Add to found advancements. The index will be used to order
-- the advancements in the table
foundAdvancementsJson[i] = decodedJson
table.insert( foundAdvancements, v )
-- Check if there's a prize
if decodedJson['prize'] then
hasPrize = true
end
end
end
-- Shortcut the nested loop if the length of wantedAdvancements and
-- foundAdvancements is the same
if #wantedAdvancements == #foundAdvancements then
break
end
end
end
-- Finally construct the table
local advancementHtml = {}
-- Header
local sortable = false
if #foundAdvancements > 1 then
sortable = true
end
table.insert( advancementHtml, createHeader( nil, hasPrize, false, sortable, f ) )
-- Rows
for i,advancement in ipairs( foundAdvancementsJson ) do
if not advancement then
local advancementsNoneSpecificFound = i18n.advancementsNoneSpecificFound:gsub( '%$1', wantedAdvancements[i] )
table.insert( advancementHtml, '<strong style="color:red">' .. advancementsNoneSpecificFound .. '</strong>' )
else
local link = args.link or i18n.advancementsPage .. '#' .. advancement['title']
local advancementRow, advancementJson = createRow(
advancement['category'], advancement['image'], advancement['background'], advancement['title'],
advancement['description'], advancement['predecessor'], advancement['actual_requirements'], advancement['id'],
advancement['prize'], upcoming, aUntil,
link, false, f
)
table.insert( advancementHtml, advancementRow )
table.insert( advancementHtml, addSmw( advancement, false ) )
end
end
-- Close table if not specified otherwise
if args.continue ~= '1' then
table.insert( advancementHtml, closeTable() )
end
return table.concat( advancementHtml, '' )
end
return p