Module:Vooruitgangen

Uit Minecraft Wiki
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]

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