אונטערשייד צווישן ווערסיעס פון "יחידה:עלטער"

פון המכלול
קפיצה לניווט קפיצה לחיפוש
אין תקציר עריכה
(באהאנדלען אויך {{לינק צו אידיש יאר}})
 
(23 מיטלסטע ווערסיעס פון 2 באַניצער נישט געוויזן.)
שורה 1: שורה 1:
local dateParser = require( "Module:דאטום" )
local dateParser = require( "Module:דאטום" )
local Arguments = require( "Module:Arguments" )
local Arguments = require( "Module:Arguments" )
local gim = require( "Module:גימטריה" )


local Errors = {
local Errors = {
['future-date'] = '[[קאטעגאריע:אומגעהעריגע לעבן-דאטעס]]'
['future-date'] = '[[קאטעגאריע:אומריכטיגע לעבן דאטומען]]'
}
}
function count(str, substring)
    local count = 0
    local _, occurrences = string.gsub(str, substring, function()
        count = count + 1
    end)
    return count
end


function ToDate(frame, Date, ApproxDate)
function ToDate(frame, Date, ApproxDate)
local isValidDate, res = pcall(dateParser.newFromWikitext, Date)
local isValidDate, res = pcall(dateParser.newFromWikitext, Date)
local errors = ''
local errors = ''
if not isValidDate then
if isValidDate and dateParser.age(res).year<0 then
-- invalid date
-- date is in the future
errors = frame:expandTemplate{ title = 'עלטער/בעיה', args = {
['מקורב']=ApproxDate,
['נוסף']=Date,
['מחרוזת']=Date
} }
-- validate
elseif dateParser.age(res)<0 then  
isValidDate = false
isValidDate = false
local title = mw.title.getCurrentTitle()
local title = mw.title.getCurrentTitle()
if title.namespace==0 then
if title.namespace==0 then
errors = Errors['future-date']-- date is in the future
errors = Errors['future-date']
else
else
errors = '<!--' .. Errors['future-date'] .. '-->'
errors = '<!--' .. Errors['future-date'] .. '-->'
end
end
elseif not isValidDate or res.precision < dateParser.PRECISION.YEAR then
-- date is either invalid or is imprecise
isValidDate = false -- mark as invalid anyway, even if "only" imprecise
errors = frame:expandTemplate{ title = 'עלטער/בעיה', args = {
['מקורב']=ApproxDate,
['נוסף']=Date,
['מחרוזת']=Date
} }
end
end
return isValidDate, res, errors
return isValidDate, res, errors
שורה 59: שורה 68:
local args = Arguments.getArgs(frame, { ['trim'] = true, ['removeBlanks'] = true })
local args = Arguments.getArgs(frame, { ['trim'] = true, ['removeBlanks'] = true })
--local age_string = args['מציין']
--local age_string = args['מציין']
local BirthDateStr = args['געבורט דאטום']
local BirthDateStr = args['געבורט דאטום'] or args['תאריך לידה עברי']
local DeathDateStr = args['פטירה דאטום']
local l = frame:preprocess(args['תאריך לידה עברי']) -- preprocess, to handle {{לינק צו אידיש יאר}}
    if args['געבורט דאטום'] == nil and (#mw.text.split(l, '%s' ) == 1 or count(l, "%[%[") == 1) then --most probably just year or yearlink
    if #mw.text.split(l, '%s' ) > 1 then
    l = l:match("%[%[.-|(.*)%]%]")
    end
    local birthParts = mw.text.split( l, "'", true )
local BirthDateNum = gim.gimatria(birthParts[1])*1000 + gim.gimatria(birthParts[2]) - 3760
if BirthDateNum < 1 then
BirthDateStr = tostring(math.abs(BirthDateNum)) .. " לפנה\"ס"
else
BirthDateStr = tostring(BirthDateNum)
end
    end
    --error(BirthDateStr)
local DeathDateStr = args['פטירה דאטום'] or args['תאריך פטירה עברי']
local p = frame:preprocess(args['תאריך פטירה עברי'])
if args['פטירה דאטום'] == nil and (#mw.text.split(p, '%s' ) == 1 or count(p, "%[%[") == 1) then --most probably just year or yearlink
    if #mw.text.split(p, '%s' ) > 1 then
    p = p:match("%[%[.-|(.*)%]%]")
    end
local deathParts = mw.text.split( p, "'", true )
local DeathDateNum = gim.gimatria(deathParts[1])*1000 + gim.gimatria(deathParts[2]) - 3760
if DeathDateNum < 1 then
DeathDateStr = tostring(math.abs(DeathDateNum)) .. " לפנה\"ס"
else
DeathDateStr = tostring(DeathDateNum)
end
end
local DisplayForAlive = args['הצג אם בחיים']
local DisplayForAlive = args['הצג אם בחיים']
local DisplayForDead = args['הצג אם נפטר']
local DisplayForDead = args['הצג אם נפטר']
שורה 72: שורה 108:
end
end


function ageCalc(BirthDateStr, DeathDateStr, DisplayForAlive, DisplayForDead, Brackets, ApproxDate)
function ageCalc(BirthDateStr, DeathDateStr, DisplayForAlive, DisplayForDead, Brackets, ApproxDate, gender)
local frame = mw.getCurrentFrame()
local frame = mw.getCurrentFrame()
local warnings = {}
local warnings = {}
שורה 79: שורה 115:
if BirthDateStr == '' then BirthDateStr = nil end
if BirthDateStr == '' then BirthDateStr = nil end
if DeathDateStr == '' then DeathDateStr = nil end
if DeathDateStr == '' then DeathDateStr = nil end
--local entityId = mw.wikibase.getEntityIdForCurrentPage()
wikidataBirth = entityId and mw.wikibase.getBestStatements( entityId, 'P569' )
wikidataBirth = entityId and mw.wikibase.getBestStatements( entityId, 'P569' )
wikidataDeath = entityId and wikidataBirth and mw.wikibase.getBestStatements( entityId, 'P570' )
wikidataDeath = entityId and wikidataBirth and mw.wikibase.getBestStatements( entityId, 'P570' )
שורה 106: שורה 141:
end
end
end
end
-- skip age calculation if we dont have enough precision
if BirthDate.precision < dateParser.PRECISION.YEAR then return nil end
local DeathDate
local DeathDate
שורה 117: שורה 155:
table.insert(warnings, '[[קאטעגאריע:דפים עם שנות חיים שלא תואמים את ויקינתונים]]')
table.insert(warnings, '[[קאטעגאריע:דפים עם שנות חיים שלא תואמים את ויקינתונים]]')
end
end
prefix = 'אלט '  
prefix = 'אלט: '  
else
else
--if (age_string) then
if gender == nil and entityId~=nil then
-- prefix = age_string..'&nbsp;'
local PropertyLink = require('Module:PropertyLink')
--else
gender = PropertyLink.getItem( 'P21', entityId )
-- prefix = frame:expandTemplate{ title = 'לפי מגדר/בדוק', args = { 'בן&nbsp;', 'בת&nbsp;' } }
if (gender == "Q6581097") then -- male
--end
gender = 'זכר'
                prefix = 'אלט '  
elseif (gender == "Q2449503") then -- transgender male
gender = 'זכר'
elseif (gender == "Q15145778") then -- cisgender male
gender = 'זכר'
elseif (gender == "Q6581072") then -- female
gender = 'נקבה'
elseif (gender == "Q1052281") then -- transgender female
gender = 'נקבה'
elseif (gender == "Q15145779") then -- cisgender female
gender = 'נקבה'
end
end
prefix = 'יארגאנג:&nbsp;'
if gender == 'נקבה' then
prefix = 'בת&nbsp;'
elseif gender == 'זכר' then
prefix = 'בן&nbsp;'
end
end
end
-- skip age calculation if we dont have enough precision
if DeathDate and DeathDate.precision and DeathDate.precision < dateParser.PRECISION.YEAR then return nil end
local success, Age = pcall(dateParser.age, BirthDate , DeathDate)
local success, AgeYears = pcall(dateParser.age, BirthDate , DeathDate)
if success then
if success then
if AgeYears == 1 then
AgeYears = Age.year
result = prefix..'שנה'
if Age.year <= 0 then
elseif AgeYears == 2 then
if Age.month == 1 then
result = prefix..'שנתיים'
result = prefix..'חודש'
elseif Age.month == 2 then
result  = prefix..'חודשיים'
else
result = prefix..tostring(Age.month)..' חודשים'
end
if Age.day > 0 then
if Age.day == 1 then
result = result..' ויום'
elseif Age.day == 2 then
result = result..' ויומיים'
else
result = result..'  ו־'..tostring(Age.day)..' ימים'
end
end
elseif Age.year < 3 then
if Age.year == 1 then
result = prefix..'שנה'
elseif Age.year == 2 then
result = prefix..'שנתיים'
end
if Age.month == 0 then
if Age.day > 0 then
if Age.day == 1 then
result = result..' ויום'
elseif Age.day == 2 then
result = result..' ויומיים'
else
result = result..'  ו־'..tostring(Age.day)..' ימים'
end
end
elseif Age.month == 1 then
result = result..' וחודש'
elseif Age.month == 2 then
result  = result..' וחודשיים'
else
result = result..' ו־'..tostring(Age.month)..' חודשים'
end
else
else
result = prefix..tostring(AgeYears)
result = prefix..tostring(Age.year)
end
end
if BirthDate.precision < dateParser.PRECISION.MONTH or (DeathDate and DeathDate.precision < dateParser.PRECISION.MONTH) then
if BirthDate.precision < dateParser.PRECISION.MONTH or (DeathDate and DeathDate.precision < dateParser.PRECISION.MONTH) then
שורה 143: שורה 240:
end
end
-- ignore warning in specific template
local noAgeWarning = false
if mw.getCurrentFrame():getParent():getTitle() == 'מוסטער:תנ"ך פערזענליכקייט' or mw.getCurrentFrame():getParent():getTitle() == 'מוסטער:בעל חיים מפורסם' then
noAgeWarning = true
end
local title = mw.title.getCurrentTitle()
local title = mw.title.getCurrentTitle()
-- ignore warning in other namespace except the main NS
-- ignore warning in other namespace except the main NS
if title.namespace==0 then
if title.namespace==0 and not noAgeWarning then
if AgeYears > 139 then  
if AgeYears > 139 then  
table.insert(warnings, Errors['future-date'])
local instanceOf = entityId and mw.wikibase.getBestStatements( entityId, 'P31' )
local isHuman = instanceOf and instanceOf[1].mainsnak and instanceOf[1].mainsnak.datavalue.value.id=='Q5'
if isHuman then
table.insert(warnings, Errors['future-date'])
end
elseif AgeYears>109 then  
elseif AgeYears>109 then  
table.insert(warnings, '[[קאטעגאריע:הונדערט-און-צען-יעריגער]]')
table.insert(warnings, '[[קאטעגאריע:מענטשן וואס זענען אנגעקומען צו די 110]]')
elseif AgeYears>99 then
elseif AgeYears>99 then
table.insert(warnings, '[[קאטעגאריע:הונדערט-יעריגער]]')
table.insert(warnings, '[[קאטעגאריע:מענטשן וואס זענען אנגעקומען צו די הונדערט]]')
end
end
end
end

יעצטיגע רעוויזיע זינט 14:51, 20 נאוועמבער 2023

דער דאזיגער בלאט באדינט דעם מוסטער:עלטער


local dateParser = require( "Module:דאטום" )
local Arguments = require( "Module:Arguments" )
local gim = require( "Module:גימטריה" )

local Errors = {
	['future-date'] = '[[קאטעגאריע:אומריכטיגע לעבן דאטומען]]'
}

function count(str, substring)
    local count = 0
    local _, occurrences = string.gsub(str, substring, function()
        count = count + 1
    end)
    return count
end

function ToDate(frame, Date, ApproxDate)
	local isValidDate, res = pcall(dateParser.newFromWikitext, Date)
	local errors = ''
	if isValidDate and dateParser.age(res).year<0 then
		-- date is in the future
		isValidDate = false
		local title = mw.title.getCurrentTitle()
		if title.namespace==0 then
			errors = Errors['future-date']
		else
			errors = '<!--' .. Errors['future-date'] .. '-->'
		end
	elseif not isValidDate or res.precision < dateParser.PRECISION.YEAR then
		-- date is either invalid or is imprecise
		isValidDate = false -- mark as invalid anyway, even if "only" imprecise
		errors = frame:expandTemplate{ title = 'עלטער/בעיה', args = { 
			['מקורב']=ApproxDate,
			['נוסף']=Date,
			['מחרוזת']=Date
			} }
	end
	return isValidDate, res, errors
end

function consistentWithWikidata(localDate, wikidataClaim)
	local possibleDate, possibleDateValue, isConsistent
	if not  wikidataClaim then
		return true
	end
	isConsistent = true
	for i,possibleDate in ipairs(wikidataClaim) do
		if possibleDate.mainsnak and possibleDate.mainsnak.datavalue and possibleDate.mainsnak.datavalue.value then
			possibleDateValue = possibleDate.mainsnak.datavalue.value
			local iswikidataValid, wikidataDate = pcall(dateParser.newFromWikidataValue, possibleDateValue)
			if iswikidataValid and localDate.calendar == wikidataDate.calendar then
				if (localDate.year ~= wikidataDate.year and possibleDateValue.precision>=dateParser.PRECISION.YEAR) or 
				   (localDate.month ~= wikidataDate.month and possibleDateValue.precision>=dateParser.PRECISION.MONTH) or 
				   (localDate.day ~= wikidataDate.day and possibleDateValue.precision>=dateParser.PRECISION.DAY)  then
					isConsistent = false
				else
					isConsistent = true
					break
				end
	 		end
 		end
	end

 	return isConsistent
end

function ageCalcFromFrame(frame)
	local args = Arguments.getArgs(frame, { ['trim'] = true, ['removeBlanks'] = true })
	--local age_string = args['מציין']
	local BirthDateStr = args['געבורט דאטום'] or args['תאריך לידה עברי']
	local l = frame:preprocess(args['תאריך לידה עברי']) -- preprocess, to handle {{לינק צו אידיש יאר}}
    if args['געבורט דאטום'] == nil and (#mw.text.split(l, '%s' ) == 1 or count(l, "%[%[") == 1) then --most probably just year or yearlink
    	if #mw.text.split(l, '%s' ) > 1 then
    		l = l:match("%[%[.-|(.*)%]%]")
    	end
    	local birthParts = mw.text.split( l, "'", true )
		local BirthDateNum = gim.gimatria(birthParts[1])*1000 + gim.gimatria(birthParts[2]) - 3760
		if BirthDateNum < 1 then
			BirthDateStr = tostring(math.abs(BirthDateNum)) .. " לפנה\"ס"
		else
			BirthDateStr = tostring(BirthDateNum)
		end
    end
    --error(BirthDateStr)
	local DeathDateStr = args['פטירה דאטום'] or args['תאריך פטירה עברי']
	local p = frame:preprocess(args['תאריך פטירה עברי'])
	if args['פטירה דאטום'] == nil and (#mw.text.split(p, '%s' ) == 1 or count(p, "%[%[") == 1) then --most probably just year or yearlink
    	if #mw.text.split(p, '%s' ) > 1 then
    		p = p:match("%[%[.-|(.*)%]%]")
    	end
		local deathParts = mw.text.split( p, "'", true )
		local DeathDateNum = gim.gimatria(deathParts[1])*1000 + gim.gimatria(deathParts[2]) - 3760
		if DeathDateNum < 1 then
			DeathDateStr = tostring(math.abs(DeathDateNum)) .. " לפנה\"ס"
		else
			DeathDateStr = tostring(DeathDateNum)
		end
	end
	local DisplayForAlive = args['הצג אם בחיים']
	local DisplayForDead = args['הצג אם נפטר']
	local Brackets = args['סוגריים']
	local ApproxDate = args['מקורב']
	
	DisplayForAlive = (DisplayForAlive=='כן')
	DisplayForDead = (DisplayForDead=='כן')
	Brackets = (Brackets~='לא')
	return ageCalc(BirthDateStr, DeathDateStr, DisplayForAlive, DisplayForDead, Brackets, ApproxDate)
end	

function ageCalc(BirthDateStr, DeathDateStr, DisplayForAlive, DisplayForDead, Brackets, ApproxDate, gender)
	local frame = mw.getCurrentFrame()
	local warnings = {}
	local dateRangeStr
	local wikidataBirth, wikidataDeath
	if BirthDateStr == '' then BirthDateStr = nil end
	if DeathDateStr == '' then DeathDateStr = nil end	
	wikidataBirth = entityId and mw.wikibase.getBestStatements( entityId, 'P569' )
	wikidataDeath = entityId and wikidataBirth and mw.wikibase.getBestStatements( entityId, 'P570' )

	BirthDateStr = BirthDateStr or ((wikidataBirth and #wikidataBirth>0 and mw.wikibase.renderSnak( wikidataBirth[1].mainsnak ) or nil))
	-- validate dates are valid
	if not BirthDateStr then
		return -- missing date, nothing to do
	end
	DeathDateStr = DeathDateStr or ((wikidataDeath and #wikidataDeath>0 and mw.wikibase.renderSnak( wikidataDeath[1].mainsnak ) or nil))
	if DeathDateStr =='' then DeathDateStr = nil end
	local IsDead = (DeathDateStr~=nil)
	
	-- early termination
	if (DisplayForDead~=IsDead) and (DisplayForAlive==IsDead) then
		return ''
	end

	local isValidDate, BirthDate, errDate = ToDate(frame, BirthDateStr, ApproxDate)
	if not isValidDate  then
		return errDate
	end
	if wikidataBirth and wikidataBirth[1] and wikidataBirth[1].mainsnak  then
		if not consistentWithWikidata(BirthDate, wikidataBirth) then
				table.insert(warnings, '[[קאטעגאריע:דפים עם שנות חיים שלא תואמים את ויקינתונים]]')
		 end
	end
	
	-- skip age calculation if we dont have enough precision
	if BirthDate.precision < dateParser.PRECISION.YEAR then return nil end
	
	local DeathDate
	if IsDead then 
		isValidDate, DeathDate, errDate =  ToDate(frame, DeathDateStr, ApproxDate)
		if not isValidDate then
			return errDate-- invalid death date
		end
	
		if not consistentWithWikidata(DeathDate, wikidataDeath) then
				table.insert(warnings, '[[קאטעגאריע:דפים עם שנות חיים שלא תואמים את ויקינתונים]]')
		 end
		prefix = 'אלט: ' 
		
	else
		if gender == nil and entityId~=nil then
			local PropertyLink = require('Module:PropertyLink')
			gender = PropertyLink.getItem( 'P21', entityId )
			if (gender == "Q6581097") then		-- male
				gender = 'זכר'
			elseif (gender == "Q2449503") then	-- transgender male
				gender = 'זכר'
			elseif (gender == "Q15145778") then	-- cisgender male
				gender = 'זכר'
			elseif (gender == "Q6581072") then	-- female
				gender = 'נקבה'
			elseif (gender == "Q1052281") then	-- transgender female
				gender = 'נקבה'
			elseif (gender == "Q15145779") then	-- cisgender female
				gender = 'נקבה'
			end
		end
		
		prefix = 'יארגאנג:&nbsp;'

		if gender == 'נקבה' then
			prefix = 'בת&nbsp;'
		elseif gender == 'זכר' then
			prefix = 'בן&nbsp;'
		end
	end
	-- skip age calculation if we dont have enough precision
	if DeathDate and DeathDate.precision and DeathDate.precision < dateParser.PRECISION.YEAR then return nil end
	
	local success, Age	 = pcall(dateParser.age, BirthDate , DeathDate)
	
	if success then
	AgeYears = Age.year
		if Age.year <= 0 then
			if Age.month == 1 then
				result = prefix..'חודש'
			elseif Age.month == 2 then
				result  = prefix..'חודשיים'
			else
				result = prefix..tostring(Age.month)..' חודשים'
			end
			if Age.day > 0 then
				if Age.day == 1 then
					result = result..' ויום'
				elseif Age.day == 2 then
					result = result..' ויומיים'
				else
					result = result..'  ו־'..tostring(Age.day)..' ימים'
				end
			end
		elseif Age.year < 3 then
			if Age.year == 1 then
				result = prefix..'שנה'
			elseif Age.year == 2 then
				result = prefix..'שנתיים'
			end
			if Age.month == 0 then
				if Age.day > 0 then
					if Age.day == 1 then
						result = result..' ויום'
					elseif Age.day == 2 then
						result = result..' ויומיים'
					else
						result = result..'  ו־'..tostring(Age.day)..' ימים'
					end
				end
			elseif Age.month == 1 then
				result = result..' וחודש'
			elseif Age.month == 2 then
				result  = result..' וחודשיים'
			else
				result = result..' ו־'..tostring(Age.month)..' חודשים'
			end
		else
			result = prefix..tostring(Age.year)
		end

		
		if BirthDate.precision < dateParser.PRECISION.MONTH or (DeathDate and DeathDate.precision < dateParser.PRECISION.MONTH) then
			result = result .. ' בערך'
		end
		
		-- ignore warning in specific template
		local noAgeWarning = false
		if mw.getCurrentFrame():getParent():getTitle() == 'מוסטער:תנ"ך פערזענליכקייט' or mw.getCurrentFrame():getParent():getTitle() == 'מוסטער:בעל חיים מפורסם' then
			noAgeWarning = true
		end
		local title = mw.title.getCurrentTitle()
		-- ignore warning in other namespace except the main NS
		if title.namespace==0 and not noAgeWarning then
			if AgeYears > 139 then 
				local instanceOf = entityId and mw.wikibase.getBestStatements( entityId, 'P31' )
				local isHuman = instanceOf and instanceOf[1].mainsnak and instanceOf[1].mainsnak.datavalue.value.id=='Q5'
				if isHuman then
					table.insert(warnings, Errors['future-date'])
				end
			elseif AgeYears>109 then 
				table.insert(warnings, '[[קאטעגאריע:מענטשן וואס זענען אנגעקומען צו די 110]]')
			elseif AgeYears>99 then
				table.insert(warnings, '[[קאטעגאריע:מענטשן וואס זענען אנגעקומען צו די הונדערט]]')
			end
		end
	else
		result = '?' .. frame:expandTemplate{ title = 'עלטער/בעיה', args = { 
			['מקורב']=ApproxDate,
			['נוסף']=DeathDate,
			['מחרוזת']=dateRangeStr
			} }
	end
	
	warnings = table.concat( warnings, '')
	if #warnings > 0 then
		warnings = string.format('%s ', warnings)
	end
	if Brackets then
		result = string.format(' (%s)', result)
	end
	return string.format('%s<span style="white-space: nowrap;">%s</span>', warnings, result)
end


return {
	['עלטער'] = ageCalcFromFrame,
	ageCalc = ageCalc
}