Modul:SelectedAnniversaries

Documentația acestui modul poate fi creată la Modul:SelectedAnniversaries/doc

local getArgs = require('Modul:Arguments').getArgs
local TableTools = require('Modul:TableTools')
local DateUtils = require('Modul:DateUtils')
local StringUtils = require('Modul:StringUtils')
local infoboxImage = require('Modul:InfoboxImage').InfoboxImage
local wikidata = nil
local p = {}

local function getNElementsFromList(list, n)
	local clonedList = mw.clone(list)
	local ret = {}
	math.randomseed(os.time())
	while n > 0 and #clonedList > 0 do
		local selectedIndex = math.random(#clonedList)
		table.insert(ret, table.remove(clonedList, selectedIndex))
		n = n - 1
	end
	return ret
end

local function processBios(list, title, datePropNumber)
	local htmlElem = mw.html.create('li'):css('-moz-float-edge', 'content-box')

	for listItemIdx = 1,#list do
		if list[listItemIdx].q then
			if not wikidata then wikidata = require('Modul:Wikidata') end
			local qItem = StringUtils._prependIfMissing({tostring(list[listItemIdx].q), 'Q'})
			list[listItemIdx].link = wikidata.findLinkToItem(qItem, true)
			local bioevtDate = wikidata.findDateValues(StringUtils._prependIfMissing({tostring(datePropNumber), 'P'}), qItem)
			list[listItemIdx].year = bioevtDate[1].year
		else
			list[listItemIdx].name = list[listItemIdx].name or list[listItemIdx].title
			list[listItemIdx].title = list[listItemIdx].title or list[listItemIdx].name
			list[listItemIdx].link = (list[listItemIdx].title == list[listItemIdx].name) and ('[[' .. list[listItemIdx].title .. ']]') or ('[[' .. list[listItemIdx].title .. '|' .. list[listItemIdx].name .. ']]')
		end
	end
	table.sort(list, function(e1, e2) return e1.year < e2.year end)
	
	local outputList = {}
	for _,listitem in ipairs(list) do
		table.insert(outputList, listitem.link .. ' (' .. DateUtils.formatYear(listitem.year, true) .. ')')
	end
	return tostring(htmlElem:wikitext("'''" .. title .. ":''' " .. table.concat(outputList, mw.text.decode(' &ndash; '))))
end

p.footer = function(day, month)
	local today = os.date("*t")
	if day and month then
		today = DateUtils.parseDate(table.concat({day, month, tostring(today.year)}, ' '))
	end
	local yesterday = DateUtils.addDaysToDate(today, -1)
	local tomorrow = DateUtils.addDaysToDate(today, 1)
	
	local daylinks = {}
	for _,eachDate in ipairs({yesterday, today, tomorrow}) do
		local eachDateStr = mw.getContentLanguage():formatDate('j F', os.date('%d %B %Y', os.time(eachDate)))
		table.insert(daylinks, '[[Format:Aniversările zilei/' .. eachDateStr .. '|' .. eachDateStr .. ']]')
	end
	
	daylinks[2] = "'''" .. daylinks[2] .. "'''"
	
	return 'Alte aniversări: ' .. table.concat(daylinks, mw.text.decode(' &ndash; '))
end

p.footerFromFrame = function(frame)
	local args = getArgs(frame)
	local day
	local month
	if args['Zi'] then day = tonumber(args['Zi']) end
	month = args['Lună']
	return p.footer(day, month)
end

p.core = function(events, specialDays, births, deaths, image, day, month, showHeader, showImage)
	local out = ''
	local workingDate = os.date("*t")
	if day and month then
		workingDate = DateUtils.parseDate(table.concat({day, month, tostring(workingDate.year)}, ' '))
	end
	
	if showHeader then
		local specialDaySeparator = tostring(mw.html.create('span'):css('white-space', 'nowrap'):wikitext(mw.text.decode('&nbsp;•'))) .. ' '
		local dateAndSpecialDaysList = {}
		table.insert(dateAndSpecialDaysList, "'''[[" .. mw.getContentLanguage():formatDate('j F', os.date('%d %B %Y', os.time(workingDate))) .. "]]''':")
		table.insert(dateAndSpecialDaysList, table.concat(specialDays, specialDaySeparator))
		out = out .. table.concat(dateAndSpecialDaysList, ' ')
	end
	
	if showImage then
		out = out .. tostring(mw.html.create('div'):css('float', 'right'):css('margin-left', '0.5em'):wikitext(infoboxImage{image=image.file, size = '100x100px', alt = image.alt, suppressplaceholder='yes'}))
	end
	
	local selectedEvents = getNElementsFromList(events, 6)
	table.sort(selectedEvents, function(evt1, evt2) return evt1.year < evt2.year end)
	out = out .. "<ul>"
	for _,eachEvent in ipairs(selectedEvents) do
		out = out .. tostring(
			mw.html.create('li'):css('-moz-float-edge', 'content-box')
				:wikitext(table.concat({DateUtils.formatYear(eachEvent.year, true), eachEvent.evt}, mw.text.decode(' &mdash; ')))
		)
	end
	
	out = out .. processBios(getNElementsFromList(births, 3), 'Nașteri', 569)
	out = out .. processBios(getNElementsFromList(deaths, 3), 'Decese', 570)
	out = out .. "</ul>"
	out = out .. tostring(mw.html.create('p'):wikitext(p.footer(day, month)))
	return out
end

p.coreFromFrame = function(frame)
	local args = getArgs(frame)

	local numData = TableTools.numData(args, true)
	local events = {}
	local specialDays = {}
	local births = {}
	local deaths = {}
	
	for _,eachNumData in ipairs(numData) do
		if eachNumData['sărbătoare'] then table.insert(specialDays, eachNumData['sărbătoare']) end
		if eachNumData['an'] and eachNumData['eveniment'] then
			local crtEvent = {}
			crtEvent.year = eachNumData['an'] and DateUtils.parseYear(eachNumData['an']).year
			crtEvent.evt = eachNumData['eveniment']
			table.insert(events, crtEvent)
		end
		if eachNumData['q_născut'] then
			local crtBirth = {}
			crtBirth.q = eachNumData['q_născut']
			table.insert(births, crtBirth)
		end
		if (eachNumData['titlu_născut'] or eachNumData['nume_născut']) and eachNumData['an_născut'] then
			local crtBirth = {}
			crtBirth.year = eachNumData['an_născut'] and DateUtils.parseYear(eachNumData['an_născut']).year
			crtBirth.title = eachNumData['titlu_născut']
			crtBirth.name = eachNumData['nume_născut']
			table.insert(births, crtBirth)
		end
		if eachNumData['q_deces'] then
			local crtDeath = {}
			crtDeath.q = eachNumData['q_deces']
			table.insert(deaths, crtDeath)
		end
		if (eachNumData['titlu_deces'] or eachNumData['nume_deces']) and eachNumData['an_deces'] then
			local crtDeath = {}
			crtDeath.year = eachNumData['an_deces'] and DateUtils.parseYear(eachNumData['an_deces']).year
			crtDeath.title = eachNumData['titlu_deces']
			crtDeath.name = eachNumData['nume_deces']
			table.insert(deaths, crtDeath)
		end
	end

	local showHeader = args['arată_antet'] and tonumber(args['arată_antet']) or 1
	local showImage = args['arată_imagine'] and tonumber(args['arată_imagine']) or 1

	return p.core(events, specialDays, births, deaths, {file = args['imagine'], alt = args['alt_imagine']}, args['zi'], args['lună'], showHeader, showImage)
end
return p