Naar inhoud springen

Module:NPO Radio 2 Top 2000

Uit Wikipedia, de vrije encyclopedie

Documentatie voor deze module kan aangemaakt worden op de volgende pagina: Module:NPO Radio 2 Top 2000/doc

-- Zie voor uitleg Sjabloon:Tabel NPO Radio 2 Top 2000

local p = {}

function p.main(frame)
	wip = frame.args.bezig
	last_edition = tonumber(frame.args.laatste_editie)
	t_args = frame:getParent().args

	table_start_1 = '{| class="wikitable'
	table_start_2 = '" style="margin: 0.2em 0 0.2em 0; font-size:85%; text-align:center;"\n! max-width="220" | Nummer'
	table_start_3 = ' met notering(en)<br />in de [[Top 2000 (Nederland)|NPO Radio 2 Top 2000]]'
	noot_wip = wip == 'ja' and 'Een \'?\' betekent dat de notering van dit jaar nog niet verwerkt is.' or ''
	noot_symbols_1 = 'Een getal geeft de notering aan'
	noot_symbols_hyphen = ', een \'-\' betekent dat het nummer niet was genoteerd'
	noot_symbols_cross = ', een \'×\' betekent dat het nummer nog niet was uitgebracht'
	noot_symbols_2 = ' en een vetgedrukt getal geeft aan dat dit de hoogste notering betreft.'
	local cat_error = '[[Categorie:Wikipedia:Foutmelding NPO Radio 2 Top 2000]]'
	local list_page_name = 'Lijst van Radio 2-Top 2000\'s'

	local qid = t_args.qid or mw.wikibase.getEntityIdForCurrentPage()
	local qids = qid and mw.text.split(qid, ',') or ''
	local data = require('Module:NPO Radio 2 Top 2000/data')

	-- het sjabloon voor de totaallijst aanroepen op "Lijst van Radio 2-Top 2000's" werkt niet, het maken van de tabel is te complex
	if mw.title.getCurrentTitle().prefixedText == list_page_name then
		local keys, all_data = data.all()
		ok, result = pcall(Top2000table, frame, keys, all_data, 'list')
	elseif #qids > 0 then
		local song_data = {}
		local unknown_songs = {}
		for k,v in ipairs(qids) do
			local song = data.get({ qid=v })
			if song == nil then
				table.insert(unknown_songs, '[[d:' .. v .. '|' .. v .. ']]')
			end
			table.insert(song_data, song)
		end
		if #song_data == #qids then
			ok, result = pcall(Top2000table, frame, qids, song_data)
		elseif #qids > 1 then
			local diff = #qids - #song_data
			local plural = diff > 1
			message = 'Van ' .. diff .. ' van de opgegeven nummers zijn geen noteringen in de NPO Radio 2 Top 2000 bekend. Weet wel dat het opgeven van meerdere artiesten of een combinatie van nummers en artiesten niet geldig is, omdat dat geen logische tabel geeft. Het opgeven van meerdere nummers kan daarentegen wel. ' .. (plural and 'Nummers die' or 'Het nummer dat') .. ' de module niet herkende: ' .. table.concat(unknown_songs, ', ') .. '.'
		else
			local artist_qid = qids[1]
			local keys, artist_data = data.find_artist({ qid=artist_qid })
			if #artist_data > 0 then
				ok, result = pcall(Top2000table, frame, keys, artist_data, artist_qid)
			else
				message = 'Van deze artiest of dit nummer ([[d:' .. artist_qid .. '|' .. artist_qid .. ']]) zijn geen noteringen in de NPO Radio 2 Top 2000 bekend.' .. (wip == 'ja' and ' Voeg dit sjabloon pas toe als de noteringen verwerkt zijn.' or '')
			end
		end
	else
		message = 'Zorg dat je dit sjabloon alleen aanroept op een pagina gekoppeld aan Wikidata, of geef zelf een Wikidata-ID mee (zie [[Sjabloon:Tabel NPO Radio 2 Top 2000|uitleg]]).'
	end

	if result then
		if ok == true then
			return result
		else
			return frame:expandTemplate{ title='Error', args={'De module gaf een foutmelding:<br />' .. result .. cat_error} }
		end
	else
		return message .. cat_error
	end
end

function Top2000table(frame, keys, data, artist_qid)
	local page = artist_qid == 'list' and 'list' or artist_qid and 'artist' or 'song'
	local one_song = #data == 1

	-- als er maar sprake is van één nummer met één notering
	if one_song then
		local in_list = 0
		for k,v in ipairs(data[1].posities) do
			if v ~= 0 then
				in_list = in_list + 1
				index = k
			end
		end
		if in_list == 1 then
			if page == 'song' then
				title = mw.wikibase.getLabelByLang(keys[1], 'nl')
			else
				title = frame:expandTemplate{ title='Wikidata', args={'label', 'short', 'linked', keys[1]} }
			end
			title = '\'\'' .. title .. '\'\''
			if data[1].titelextra then title = title .. ' (' .. data[1].titelextra .. ')' end
			result = title .. ' stond alleen in ' .. 1999 + index - 1 .. ' in de NPO Radio 2 Top 2000, op plek ' .. data[1].posities[index] .. '.'
			if wip == 'ja' then
				result = result .. ' De noteringen van ' .. last_edition .. ' worden nog verwerkt.'
			end
			return result
		end
	end

	-- uitzoeken bij welke jaren er een of meer noteringen waren
	local years_listed = {}
	for year=1999, last_edition do
		local index = year - 1999 + 1
		for k,v in ipairs(data) do
			if v.posities[index] and v.posities[index] ~= 0 then
				years_listed[year] = true
				break
			end
		end
	end

	-- voor ieder nummer de al dan niet gelinkte titel maken (met eventuele titelextra) en de hoogste notering berekenen
	for k,v in ipairs(data) do
		v.positions = ''
		if page == 'song' then
			v.title = mw.wikibase.getLabelByLang(keys[k], 'nl')
		else
			v.title = frame:expandTemplate{ title='Wikidata', args={'label', 'short', 'linked', keys[k]} }
		end
		v.title = '\'\'' .. v.title .. '\'\''
		if v.titelextra then v.title = v.title .. ' (' .. v.titelextra .. ')' end
		local positions_greater_zero = {}
		for i,w in ipairs(v.posities) do
			if w ~= 0 then
				table.insert(positions_greater_zero, w)
			end
		end
		v.highest_position = math.min(unpack(positions_greater_zero))
	end

	local first_year = true
	local last_year = 1999
	local interval = 0
	local years = ''

	-- de tabelinhoud maken
	for year=1999, last_edition do
		year_listed = years_listed[year]
		-- als een of meerdere nummers dit jaar een notering hadden
		if year_listed then
			last_year = year
			-- als in het geheugen nog een aantal "tussenjaren" > 0 zit (en deze niet vóór de allereerste notering zijn), moet er eerst nog een lege kolom toegevoegd worden
			if interval > 0 and first_year == false then
				years = years .. '!!\'' .. mw.ustring.sub(year - interval, 3, 4)
				-- als het aantal tussenjaren groter dan 1 was, doe dan x-y ipv alleen x
				if interval > 1 then
					years = years .. '-\'' .. mw.ustring.sub(year - 1, 3, 4)
				end
				-- een lege kolom toevoegen, dus voor ieder nummer een streepje of kruisje (voor de bepaling hiervan wordt het laatste tussenjaar gebruikt, een streepje krijgt dus "voorrang" op een kruisje)
				for k,v in ipairs(data) do
					if year - 1 >= v.eerstmogelijkejaar then
						add = '-'
						hyphen = true
					else
						add = '×'
						cross = true
					end
					v.positions = v.positions .. '||' .. add
				end
			end

			-- het jaar toevoegen aan de rij met jaren
			years = years .. '!!\'' .. mw.ustring.sub(year, 3, 4)
			-- als dit het eerste jaar met notering is en niet de eerste Top 2000-editie (1999), voeg een opmerking toe
			if first_year and year > 1999 then
				if page == 'artist' then word = 'deze artiest'
				elseif one_song then word = 'dit nummer'
				else word = 'een van deze nummers' end
				first_year_noot = year .. ' was het eerste jaar met een notering voor ' .. word .. '.'
				years = years .. 'first_year_noot_placeholder'
			end
			first_year = false
			interval = 0

			-- voor ieder nummer de juiste notering toevoegen, mits die er is (niet 0 is), anders een streepje of kruisje
			local index = year - 1999 + 1
			for k,v in ipairs(data) do
				local add = year >= v.eerstmogelijkejaar and '-' or '×'
				position = v.posities[index]
				if position ~= 0 then
					add = position
					if position == v.highest_position then
						add = '\'\'\'' .. position .. '\'\'\''
					end
				end
				if add == '-' then hyphen = true end
				if add == '×' then cross = true end
				v.positions = v.positions .. '||' .. add
			end
		-- als geen nummer een notering had, wordt het aantal tussenjaren vermeerderd met 1
		else
			interval = interval + 1
		end
	end

	-- als aan de huidige editie wordt gewerkt, komt er een kolom met vraagtekens bij
	if wip == 'ja' then
		for k,v in ipairs(data) do
			-- als er een editie tussen de huidige editie en de recentste editie met een genoteerd nummer zit, voeg dan eerst nog een lege kolom toe (er komt dan nog een kolom met tussenjaren)
			if last_year + 1 ~= last_edition then
				v.positions = v.positions.. '||' .. '-'
				hyphen = true
			end
			v.positions = v.positions .. '||' .. '?'
		end
		-- als er een kolom tussenjaren moet komen
		if last_year + 1 ~= last_edition then
			-- de juiste jaartallen daarvoor berekenen en als het aantal tussenjaren groter dan 1 is, doe dan x-y ipv alleen x
			years = years .. '!!\'' .. mw.ustring.sub(last_year + 1, 3, 4)
			if last_year + 1 ~= last_edition - 1 then
				years = years .. '-\'' .. mw.ustring.sub(last_edition - 1, 3, 4)
			end
		end
		-- het jaar van de aankomende editie toevoegen aan de rij met jaren
		years = years .. '!!\'' .. mw.ustring.sub(last_edition, 3, 4)
	end

	-- de titels van de tabelrijen sorteren op alfabet
	table.sort(data, function(a, b) return a.title < b.title end)

	local content = ''

	-- eventuele medeartiesten toevoegen
	for k,v in ipairs(data) do
		local coartists = ''
		local add = ''
		-- alleen (mede)artiesten toevoegen als het een artiestenpagina betreft en er meerdere artiesten zijn of als de sjabloonparameter "artiesten" (alleen op een nummerpagina) de waarde "ja" heeft of als de grote lijst wordt aangemaakt
		if page == 'artist' and #v.artiest > 1 or page == 'song' and t_args.artiesten == 'ja' or page == 'list' then
			coartists = ' ('
			if #v.artiest > 1 then
				if page == 'artist' then coartists = coartists .. 'met ' end
				-- iedere artiest van het nummer langsgaan en toevoegen, mits niet de "eigen" artiest (in het geval van een artiestenpagina)
				for i,w in ipairs(v.artiest) do
					if w ~= artist_qid then
						if #coartists > 6 then coartists = coartists .. ', ' end
						if add then coartists = coartists .. add end
						-- bij een nummerpagina de artiest niet linken, bij een artiestenpagina of de grote lijst wel
						if page == 'song' then
							add = mw.wikibase.getLabelByLang(w, 'nl')
						else
							add = frame:expandTemplate{ title='Wikidata', args={'label', 'short', 'linked', w} }
						end
					end
				end
				if #coartists > 6 then coartists = coartists .. ' & ' end

			-- in het geval van een nummerpagina en artiesten=ja met maar één artiest of de grote lijst met maar één artiest
			else
				if page == 'song' then
					add = mw.wikibase.getLabelByLang(v.artiest[1], 'nl')
				else
					add = frame:expandTemplate{ title='Wikidata', args={'label', 'short', 'linked', v.artiest[1]} }
				end
			end
			coartists = coartists .. add .. ')'
		end

		-- de tabelrijen aan elkaar toevoegen
		content = content .. '\n|-\n|' .. v.title .. coartists .. v.positions
	end

	-- de cel linksboven aanmaken met gebruik van meervoud als er meerdere nummers zijn
	local table_start = table_start_1 .. (one_song and '' or ' sortable') .. table_start_2 .. (one_song and '' or 's') .. table_start_3
	-- alleen de relevante uitleg geven in de noot
	local noot_symbols = frame:expandTemplate{ title='Refn', args={noot_symbols_1 .. (hyphen and noot_symbols_hyphen or '') .. (cross and noot_symbols_cross or '') .. noot_symbols_2 .. noot_wip, group='noot', name='T2000'} }

	-- als er een noot is over het eerste jaar met een notering, wordt die hier pas toegevoegd (vanwege referentievolgorde)
	if first_year_noot then
		years = years:gsub('first_year_noot_placeholder', frame:expandTemplate{ title='Refn', args={first_year_noot, group='noot'} })
	end

	-- als de laatste Top 2000-editie niet voorkomt in de tabel en er niet aan de huidige editie wordt gewerkt, wordt een noot toegevoegd over de laatste keer dat de tabel is bijgewerkt
	if not years_listed[last_edition] and wip == 'nee' then
		years = years .. frame:expandTemplate{ title='Refn', args={'Deze tabel is bijgewerkt tot de laatste editie (' .. last_edition .. ').', group='noot'} }
	end

	local table_end = '\n|}\n' .. frame:expandTemplate{ title='References', args={'85%', group='noot'} }

	return table_start .. noot_symbols .. years .. content .. table_end
end

return p