לדלג לתוכן

יחידה:תבנית מידע/אישיות: הבדלים בין גרסאות בדף

מתוך צפונות ויקי
מאין תקציר עריכה
מאין תקציר עריכה
שורה 21: שורה 21:


local function getDeathLabel(deathCause, entityId)
local function getDeathLabel(deathCause, entityId)
local result=''
entityId = entityId or mw.wikibase.getEntityIdForCurrentPage()
entityId = entityId or mw.wikibase.getEntityIdForCurrentPage()
if ( deathCause == nil or deathCause =='' ) and entityId ~= nil then
if ( deathCause == nil or deathCause =='' ) and entityId ~= nil then
שורה 39: שורה 40:
return (gender=='נקבה' and 'התאבדה') or 'התאבד'
return (gender=='נקבה' and 'התאבדה') or 'התאבד'
elseif deathCause == 'הוצא להורג' or deathCause == 'הוצאה להורג' or deathCause == 'עונש מוות' or deathCause == 'תלייה' then
elseif deathCause == 'הוצא להורג' or deathCause == 'הוצאה להורג' or deathCause == 'עונש מוות' or deathCause == 'תלייה' then
return 'הוצאה להורג'
return 'הוצאה להורג'
else result='[[קטגוריה:ערכים עם סיבת מוות שגויה]]'
end
end
end
end
return 'פטירה'
return result .. 'פטירה'
end
end
function getEventDetails(generalDate, hebDate, eventPlace, propDate, propPlace, age, usingWikidata, infoObj)
function getEventDetails(generalDate, hebDate, eventPlace, propDate, propPlace, age, usingWikidata, infoObj)

גרסה מ־07:07, 21 באוקטובר 2019

יחידה זו מרחיבה את יחידה:תבנית מידע עבור תבניות מידע של אישים. היחידה כוללת תמיכה אוטומטית בפרמטרים האופיינים לאישים כדוגמת תאריכים ומקומות של לידה/פטירה, יחד עם ציון גיל.


local Infobox = require('Module:תבנית מידע').Infobox
local LocationAndCountry = require('Module:LocationAndCountry')
local PropertyLink = require('Module:PropertyLink')
local ageModule = require('Module:גיל לערכי אישים')
local Date = require('Module:תאריך')
local hebrewDateModule = require('Module:תאריך עברי')
local WikidataCrossValidation = require('Module:WikidataCrossValidation')

--[[ Get general date if known, otherwise guess from hebrew date.
]]
function getSpeculativeDate(generalDate, hebrewDate)
	if generalDate == '-' then return nil end
	if generalDate~=nil and generalDate~='' then return generalDate end
	if hebrewDate~=nil and hebrewDate~='' then
		local success, sepcDate = pcall(hebrewDateModule.pick, mw.getCurrentFrame():newChild{ args = {hebrew=hebrewDate, world='', exact='כן' } })
		if not success or sepcDate=='' then return nil end
		return sepcDate
	end
	return nil
end

local function getDeathLabel(deathCause, entityId)
	local result=''
	entityId = entityId or mw.wikibase.getEntityIdForCurrentPage()
	if ( deathCause == nil or deathCause =='' ) and entityId ~= nil then
		local deathCauseWikidata = mw.wikibase.getBestStatements(entityId, 'P1196')
		deathCauseWikidata = deathCauseWikidata and deathCauseWikidata[1] and deathCauseWikidata[1].mainsnak
		if deathCauseWikidata then
			deathCause = mw.wikibase.renderSnak(deathCauseWikidata)
		end
	end
	local gender = PropertyLink.getPropertyByOptions( 'P21', entityId )
	
	if deathCause and deathCause ~= '' then
		if deathCause == 'נהרג' or deathCause == 'נהרגה' then
			return (gender=='נקבה' and 'נהרגה') or 'נהרג'
		elseif deathCause == 'נרצח' or deathCause == 'נרצחה' or deathCause == 'רצח' then
			return (gender=='נקבה' and 'נרצחה') or 'נרצח'
	        elseif deathCause == 'התאבד' or deathCause == 'התאבדה' or deathCause == 'התאבדות' then
			return (gender=='נקבה' and 'התאבדה') or 'התאבד'
		elseif deathCause == 'הוצא להורג' or deathCause == 'הוצאה להורג' or deathCause == 'עונש מוות' or deathCause == 'תלייה' then
			return 'הוצאה להורג'
		else result='[[קטגוריה:ערכים עם סיבת מוות שגויה]]'
		end
	end
	return result .. 'פטירה'
end
function getEventDetails(generalDate, hebDate, eventPlace, propDate, propPlace, age, usingWikidata, infoObj)
	entityId = infoObj.args.entityId or mw.wikibase.getEntityIdForCurrentPage()
	age = age or ''
	local formattedEvent
	local placeDate = propDate
	if generalDate~=nil and generalDate~='' then
		local success, placeDateParsed  = pcall(Date.newFromWikitext, generalDate)
		if success then
			placeDate = placeDateParsed
		end
		formattedEvent = generalDate .. age
		if hebDate~=nil and hebDate~='' then 
			formattedEvent = formattedEvent ..'<br/>' ..hebDate
		end
	elseif  hebDate~=nil and hebDate~='' then
		formattedEvent = hebDate .. age
	end
	
	if (eventPlace == nil or eventPlace == '') and entityId then
		local success, res  = pcall(LocationAndCountry.displayFromParams, propPlace, entityId, placeDate , 1)
		if success and res and #res>0 then
			usingWikidata = true
			eventPlace = res
		end
	else
		local pageNs = mw.title.getCurrentTitle().namespace
		if pageNs==0 then
			local matching = WikidataCrossValidation.crossValidate(eventPlace, propPlace, entityId )
			if matching then
				table.insert(infoObj.wikidataCats, WikidataCrossValidation.maintainceCategory(matching, propPlace))
			end
		end
	end

	if eventPlace~='' and eventPlace~=nil and eventPlace~='-' then
		formattedEvent = formattedEvent..'<br/>' ..eventPlace
	end
	
	if usingWikidata and entityId then
		formattedEvent = formattedEvent .. ' [[File:Blue pencil RTL.svg|15px|link=https://www.wikidata.org/wiki/'..entityId.. '?uselang=he#P569|עריכת הנתון בוויקינתונים]]'
	end

	return formattedEvent, usingWikidata
end

function addMissingImage(infoObj, birthDate, deathDate)
	if infoObj.args.image ~= nil and #infoObj.args.image > 0 then return end  -- there is already image 
	local latestDate = deathDate or birthDate
	if latestDate == nil then return end
	local dateModule = require('Module:תאריך')
	local success, res = pcall(dateModule.parseDateRange, latestDate, 'raw')
	if success==false then return end -- there is no known VALID date
	local yearsEstimated = res/(60*60*24*365)
	if yearsEstimated>150 then return end 
	
	if infoObj.args.entityId == nil then
		return false -- no wikidata entity
	end

	local gender = PropertyLink.getPropertyByOptions( 'P21', infoObj.args.entityId )
	local frame = mw.getCurrentFrame()
	infoObj.args.image = frame:expandTemplate{ title = 'אין תמונה', args = { gender, ['יישור'] = 'center' } }
end

function fillWikidataParam(templateArgs, paramName, property, infoObj)
	local usingWikidata = false
	if infoObj.args.entityId == nil then
		return false -- no wikidata entity
	end
	if templateArgs[paramName]==nil or templateArgs[paramName]=='' then
		templateArgs[paramName] = PropertyLink.getPropertyByOptions( property, infoObj.args.entityId )
		if templateArgs[paramName] and #templateArgs[paramName]>0 then
			usingWikidata = true
		end
	else
		local pageNs = mw.title.getCurrentTitle().namespace
		if pageNs==0 then
			local matching = WikidataCrossValidation.crossValidate(templateArgs[paramName], property, infoObj.args.entityId )
			if matching then
				table.insert(infoObj.wikidataCats, WikidataCrossValidation.maintainceCategory(matching, property))
			end
		end
	end
	return usingWikidata
end

function addPersonDetails(frame, infoObj)
	local templateArgs = frame:getParent().args
	local usingBirthWikidata = false
	local usingDeathWikidata = false
	local birthLabel = 'לידה'
	local deathLabel = 'פטירה' 
	
	-- fill birth/death dates from wikidata is missing
	usingBirthWikidata = fillWikidataParam(templateArgs, 'תאריך לידה', 'P569', infoObj)
	usingDeathWikidata = fillWikidataParam(templateArgs, 'תאריך פטירה', 'P570', infoObj)
	
	local birthDate = getSpeculativeDate(templateArgs['תאריך לידה'], templateArgs['תאריך לידה עברי'])
	local deathDate = getSpeculativeDate(templateArgs['תאריך פטירה'], templateArgs['תאריך פטירה עברי'])
	
	if birthDate~=nil then
		local age = nil
		if deathDate==nil then
			age = ageModule.ageCalc(birthDate, nil, true, false, true) or ''
		end
		local birthDetails, usingBirthWikidataEvent = getEventDetails(templateArgs['תאריך לידה'], templateArgs['תאריך לידה עברי'], templateArgs['מקום לידה'], 'P569', 'P19', age, usingBirthWikidata, infoObj)
			table.insert(infoObj.templateStructure, 1, {
			label='לידה',
			data=birthDetails
		})
		usingBirthWikidata = usingBirthWikidata or usingBirthWikidataEvent
	elseif templateArgs['מקום לידה']~= '-' then
		fillWikidataParam(templateArgs, 'מקום לידה', 'P19', infoObj)
		table.insert(infoObj.templateStructure, 1, {
			label=birthLabel,
			data= templateArgs['מקום לידה']
		})
	end
	
	if deathDate~=nil then
		deathLabel = getDeathLabel(templateArgs['סיבת המוות'], infoObj.args.entityId)
		local age =  ageModule.ageCalc(birthDate, deathDate, false, false, true) or ''
		local deathDetails, usingDeathWikidataEvent = getEventDetails(templateArgs['תאריך פטירה'], templateArgs['תאריך פטירה עברי'], templateArgs['מקום פטירה'], 'P570', 'P20', age, usingDeathWikidata, infoObj)
			table.insert(infoObj.templateStructure, 2, {
			label=deathLabel,
			data=deathDetails
		})
		usingDeathWikidata = usingDeathWikidata or usingDeathWikidataEvent
	elseif templateArgs['מקום פטירה']~= '-' then
		fillWikidataParam(templateArgs, 'מקום פטירה', 'P20', infoObj)
		table.insert(infoObj.templateStructure, 2, {
			label=deathLabel,
			data= templateArgs['מקום פטירה']
		})
	end
	
	if infoObj.isSelfUse then
			table.insert(infoObj.templateStructure, 1, {
			label=birthLabel,
			data='{{{תאריך לידה}}}<br/>{{{מקום לידה}}}'
			})
		table.insert(infoObj.templateStructure, 2, {
			label=deathLabel,
			data='{{{תאריך פטירה}}} <br/>{{{מקום פטירה}}}'
			})
	end	
	
	if usingBirthWikidata or usingDeathWikidata then
		infoObj.args.usingWikidata = true
	end
	
	if frame.args['כותרת0'] then
		table.insert(infoObj.templateStructure, 1, {
			header=1,
			data=frame.args['כותרת0'],
			rowstyle=frame.args['עיצוב-שורה0'],
			rowclass=frame.args['מחלקה-שורה0'],
			headerstyle=frame.args['כותרת0-עיצוב']
		})
	end

	if frame.args['תמונה']~='-' then
		addMissingImage(infoObj, birthDate, deathDate)
	end
end

function infobox(frame)
	local infoObj = Infobox:new()
	frame.args['תמונה-גודל'] = frame.args['תמונה-גודל']  or '220'
	infoObj:parseArgs(frame)
	
	if infoObj.args.title~='-' then
		addPersonDetails(frame, infoObj)
	end
	return infoObj:render()
end


return 	{
	['מידע']=infobox,
	['addPersonDetails'] = addPersonDetails
}