Naar inhoud springen

Module:Datastaven

Uit Wikipedia, de vrije encyclopedie
Dit is een oude versie van deze pagina, bewerkt door Strepulah (overleg | bijdragen) op 10 jan 2021 om 15:23. (Module:Eindstanden aangemaakt)
Deze versie kan sterk verschillen van de huidige versie van deze pagina.
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Moduledocumentatie​[bekijk] [bewerk] [ververs] [geschiedenis]

Deze module kan gebruikt worden voor het in een staafdiagram weergeven van klasseringen / aantallen / rangen / posities / standen / eindstanden of iets in die trant. Of iets anders.

Deze module wordt toegepast in Sjabloon:Datastaven. Zie voor een overzicht van parameters de documentatie aldaar.

Gebruik

Standaard:

{{#invoke:Datastaven|main}}

Speciaal voor eindstanden kan ook gebruik worden gemaakt van:

{{#invoke:Datastaven|main|type=eindstanden}}

Kleuren

De kleuren van de staven kunnen zowel ingesteld worden op de groepen als op individuele staven. Als er geen kleur is opgegeven wordt er een uit het standaardkleurenpalet gehaald:

(Bewerk)

(Bewerk)

Zie ook

require('Module:No globals')

local p = {}
local getArgs = require('Module:Arguments').getArgs
local unpackItem = require('Module:Item').unpack
local templatestyles = 'Module:Eindstanden/styles.css'

-- Options
local chartHeight = 150
local barWidth = 18
local colors = {
	'#002a62', '#2c699a', '#db0c23', '#e36271',
	'#e99fa8', '#618b25', '#6bd425', '#eee8aa',
	'#eca72c', '#fff943', '#ffe4e1', '#dda0dd',
	'#0b6b61', '#3ec9a6', '#edf669', '#aabc1e',
	'#95291d', '#ee2b08', '#999999', '#ffffff'
}

local function isItem(arg)
	return mw.ustring.find(arg, '|', 1, true) == 1
end

local function extractData(args)
	local data = {
		bars = {},
		groups = {},
		maxY = args.maxY or 10
	}
	
	for _, arg in ipairs(args) do
		if isItem(arg) then
			local bar = unpackItem(arg)
			table.insert(data.bars, bar)
			
			if bar['group'] then
				data.groups[bar['group']] = true
			end
			data.maxY = math.max(data.maxY, bar['y'] or data.maxY)
		end
	end
	
	return data
end

local function drawTooltip(bar)
	local groupText = nil
	
	if bar['group'] then
		groupText = mw.html.create():tag('br'):done():wikitext(bar['group'])
		if bar['div'] then groupText:wikitext(' ' .. bar['div']) end
	end
	
	return mw.html.create('div')
		:addClass('es-tip')
		:tag('b'):wikitext(bar['x']):done()
		:node(groupText)
		:tag('br'):done():wikitext(bar['y']):done()
end

local function drawBars(data)
	local bars = mw.html.create()
	
	for i, bar in ipairs(data.bars) do
		local x = mw.ustring.sub(bar['x'], -2) -- Show only the last two digits of the year
		local y = bar['y'] or data.maxY
		local h = chartHeight * (1 - (y / (data.maxY + 1))) .. 'px'
		local c = colors[math.min(i, #colors)]
		
		bars
			:tag('li')
			:addClass('es-bar')
			:attr('data-x', x)
			:attr('data-y', y)
			:css('--bar-h', h)
			:css('--bar-c', c)
			:node(drawTooltip(bar))
	end
	
	return bars
end

local function drawLegend(data)
	local i = 1
	local legend = mw.html.create('div')
		:addClass('es-legend')
		:tag('ul')
	
	for group, _ in pairs(data.groups) do
		legend
			:tag('li')
			:tag('span')
			:css('color', colors[math.min(i, #colors)])
			:wikitext('◼'):done()
			:wikitext(' ' .. group)
			
		i = i + 1
	end
	
	return legend:done()
end

local function drawChart(args)
	local data = extractData(args)
	-- return mw.dumpObject(data)
	local chart = mw.html.create()
		:tag('ul')
		:addClass('es-chart')
		:css('width', barWidth * #data.bars .. 'px')
		:css('height', chartHeight .. 'px')
		:css('--bar-w', barWidth .. 'px')
		:node(drawBars(data))
		:done()
		:node(drawLegend(data))
	
	return tostring(chart)
end

function p.main(frame)
	return frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles } } .. drawChart(getArgs(frame))
end

return p