Module:Index

Uit Wikisource

Documentatie voor deze module kan aangemaakt worden op de volgende pagina: Module:Index/doc

require( 'strict' )

local p = {}

local getArgs = require('Module:Arguments').getArgs

local function rangtelwoord(getal)
	local rangtelwoorden = {
		'eerste', 'tweede', 'derde', 'vierde', 'vijfde',
		'zesde', 'zevende', 'achtste', 'negende'
	}
	
	local woord = rangtelwoorden[getal]
	if not woord then
		woord = tostring(getal) .. 'e'
	end
	
	return woord
end

local function rij(id, th, td)
	return mw.html.create('tr')
		:attr('id', id)
		:tag('th')
			:attr('scope', 'row')
			:node(th)
			:done()
		:tag('td')
			:wikitext(td)
		:allDone()
end

local function voegLokaleDataToe(elementen, args)
	local zoek_elementen = {
		'Titel',
		'Deel',
		'Ondertitel',
		'Auteur',
		'Vertaler',
		'Redacteur',
		'Illustrator',
		'Uitgave',
		'Jaar',
		'Uitgever',
		'Plaats',
		{'Bron', function()
			if args.Bron then
				local titel = mw.title.getCurrentTitle()
				local brontitel = mw.title.makeTitle('Bestand', titel.text)
				if brontitel.file.exists then
					return '[[:' .. brontitel.prefixedText .. '|' .. args.Bron .. ']]'
				else
					return args.Bron
				end
			end
		end},
		{'Voortgang', function()
			if args.Voortgang then
				local voortgangsberichten = {
					T   = "[[Categorie:Wikisource:Gecontroleerd]][[:Categorie:Wikisource:Gecontroleerd|Klaar — Alle pagina's van het werk zijn gecontroleerd]]",
					V   = "[[Categorie:Wikisource:Proefgelezen]][[:Categorie:Wikisource:Proefgelezen|Proefgelezen — Alle pagina's van het werk zijn proefgelezen, maar nog niet gecontroleerd]]",
					C   = "[[Categorie:Wikisource:Niet proefgelezen]][[:Categorie:Wikisource:Niet proefgelezen|Moet nog proefgelezen worden]]",
					MS  = "[[Categorie:Wikisource:Samenvoegen en opsplitsen]][[:Categorie:Wikisource:Samenvoegen en opsplitsen|Samenvoegen en opsplitsen]]",
					OCR = "[[Categorie:Wikisource:OCR-laag nodig]][[:Categorie:Wikisource:OCR-laag nodig|OCR-laag nodig]]",
					L   = "[[Categorie:Wikisource:Incorrect bestand]][[:Categorie:Wikisource:Incorrect bestand|<span class=error>Bestand moet worden gerapareerd voordat begonnen wordt met proeflezen</span>]]",
					X   = "[[Categorie:Wikisource:Bestand nakijken]][[:Categorie:Wikisource:Bestand nakijken|<span class=error>Maak een paginalijst aan voor het bestand voordat begonnen wordt met proeflezen (om te controleren of het bestand correct is)</span>]]"
				}
		
				return voortgangsberichten[args.Voortgang] or "[[Categorie:Wikisource:Onbekende status]][[:Categorie:Wikisource:Onbekende status|Onbekende status]]"
			end
		end},
		'Delen',
	}
	
	for k, v in ipairs(zoek_elementen) do
		if type(v) == 'table' then
			elementen[v[1]] = v[2]()
			elementen.aliases[k] = v[1]
		else
			-- Standaardfunctionaliteit
			if args[v] then
				elementen[v] = args[v]
			end
			elementen.aliases[k] = v
		end
	end
	
	if not elementen.lengte or elementen.lengte < #zoek_elementen then
		elementen.lengte = #zoek_elementen
	end
end

local function zoekWikidataId(args)
	local wikidata_id = nil
	if args.wikidata and #args.wikidata > 0 then -- als er een wikidata id is
		wikidata_id = args.wikidata
	elseif args.Titel then -- anders proberen we of de titelpagina een wikidata heeft
		string.gsub(args.Titel, '^%[%[([^]|]*).*$', function(paginatitel)
			wikidata_id =  mw.wikibase.getEntityIdForTitle(paginatitel)
		end)
	end
	
	return wikidata_id
end

local function voegWikidataToe(elementen, wikidata_id)
	local vraagWikidata = require('Module:Wikidata Boek').vraagWikidata
	local data = vraagWikidata(wikidata_id)
	
	if not elementen.Titel and data.titel.titel then
		elementen.Titel = data.titel.titel
	end
	if not elementen.Ondertitel and data.titel.ondertitel then
		elementen.Ondertitel = data.titel.ondertitel
	end
	if not elementen.Auteur and #data.auteurs > 0 then
		elementen.Auteur = table.concat(data.auteurs, ', ')
	end
	if not elementen.Vertaler and #data.vertalers > 0 then
		elementen.Vertaler = table.concat(data.vertalers, ', ')
	end
	if not elementen.Uitgave and data.drukInfo.druk then
		if data.drukInfo.druk.schrijfwijze then
			elementen.Uitgave = data.drukInfo.druk.schrijfwijze
		else
			local druknummer = tonumber(data.drukInfo.druk.nummer)
			if druknummer then
				local telwoord = rangtelwoord(druknummer)
				local telwoord = string.gsub(telwoord, '^%l', string.upper) -- eerste letter hoofdletter
				elementen.Uitgave = telwoord .. ' druk'
			else
				elementen.Uitgave = data.drukInfo.druk.nummer
			end
		end
	end
	if not elementen.Plaats and data.drukInfo.plaats then
		elementen.Plaats = data.drukInfo.plaats
	end
	if not elementen.Uitgever and data.drukInfo.uitgever then
		elementen.Uitgever = data.drukInfo.uitgever
	end
	if not elementen.Jaar and data.drukInfo.jaar then
		elementen.Jaar = data.drukInfo.jaar
	end
	
	return elementen
end

function p.tekenInformatieWerk(frame)
	local args = getArgs(frame)
	local elementen = {}
	local aliases = {}
	setmetatable(elementen, {__index = function(t, k) if k == 'aliases' then return aliases else return rawget(t, aliases[k]) end end})
	
	voegLokaleDataToe(elementen, args)

	local wikidata_id = zoekWikidataId(args)
	if wikidata_id then -- als wikidata gevonden
		elementen = voegWikidataToe(elementen, wikidata_id)
	end

	local tabel = mw.html.create('table')
		:attr('id', 'ws-index-informatie-werk')
	
	for i = 1, elementen.lengte do
		if elementen[i] then
			local veld = elementen.aliases[i]
			local tekst = elementen[i]
			tabel:node(rij('ws-index-' .. string.lower(veld), veld, tekst))
		end
	end
	
	return tabel
end

return p
Afkomstig van Wikisource NL, de Vrije Bron. "https://nl.wikisource.org/w/index.php?title=Module:Index&oldid=172805"