אונטערשייד צווישן ווערסיעס פון "יחידה:עלטער"
קפיצה לניווט
קפיצה לחיפוש
אין תקציר עריכה |
(באהאנדלען אויך {{לינק צו אידיש יאר}}) |
||
(22 מיטלסטע ווערסיעס פון 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) | ||
שורה 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['הצג אם נפטר'] | ||
שורה 119: | שורה 155: | ||
table.insert(warnings, '[[קאטעגאריע:דפים עם שנות חיים שלא תואמים את ויקינתונים]]') | table.insert(warnings, '[[קאטעגאריע:דפים עם שנות חיים שלא תואמים את ויקינתונים]]') | ||
end | end | ||
prefix = 'אלט' | prefix = 'אלט: ' | ||
else | else | ||
שורה 140: | שורה 176: | ||
end | end | ||
prefix = ' | prefix = 'יארגאנג: ' | ||
if gender == 'נקבה' then | if gender == 'נקבה' then | ||
שורה 206: | שורה 242: | ||
-- ignore warning in specific template | -- ignore warning in specific template | ||
local noAgeWarning = false | local noAgeWarning = false | ||
if mw.getCurrentFrame():getParent():getTitle() == ' | if mw.getCurrentFrame():getParent():getTitle() == 'מוסטער:תנ"ך פערזענליכקייט' or mw.getCurrentFrame():getParent():getTitle() == 'מוסטער:בעל חיים מפורסם' then | ||
noAgeWarning = true | noAgeWarning = true | ||
end | end | ||
שורה 213: | שורה 249: | ||
if title.namespace==0 and not noAgeWarning 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, '[[קאטעגאריע:מענטשן וואס זענען אנגעקומען צו די 110]]') | 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 = 'יארגאנג: '
if gender == 'נקבה' then
prefix = 'בת '
elseif gender == 'זכר' then
prefix = 'בן '
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
}