יחידה:גיל לערכי אישים
מראה
מען קען שאפן דאקומענטאציע פאר דעם מאדול ביי יחידה:גיל לערכי אישים/דאק
local dateParser = require( "Module:תאריך" )
local Arguments = require( "Module:Arguments" )
local Errors = {
['future-date'] = '[[קאטעגאריע:תאריכי חיים לא נכונים]]'
}
function ToDate(frame, Date, ApproxDate)
local isValidDate, res = pcall(dateParser.newFromWikitext, Date)
local errors = ''
if not isValidDate then
-- invalid date
errors = frame:expandTemplate{ title = 'גיל לערכי אישים/בעיה', args = {
['מקורב']=ApproxDate,
['נוסף']=Date,
['מחרוזת']=Date
} }
-- validate
elseif dateParser.age(res)<0 then
isValidDate = false
local title = mw.title.getCurrentTitle()
if title.namespace==0 then
errors = Errors['future-date']-- date is in the future
else
errors = '<!--' .. Errors['future-date'] .. '-->'
end
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['תאריך לידה']
local DeathDateStr = args['תאריך פטירה']
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)
local frame = mw.getCurrentFrame()
local warnings = {}
local dateRangeStr
local wikidataBirth, wikidataDeath
if BirthDateStr == '' then BirthDateStr = nil end
if DeathDateStr == '' then DeathDateStr = nil end
local entityId = mw.wikibase.getEntityIdForCurrentPage()
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
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 (age_string) then
-- prefix = age_string..' '
--else
-- prefix = frame:expandTemplate{ title = 'לפי מגדר/בדוק', args = { 'בן ', 'בת ' } }
--end
end
local success, AgeYears = pcall(dateParser.age, BirthDate , DeathDate)
if success then
if AgeYears == 1 then
result = prefix..'שנה'
elseif AgeYears == 2 then
result = prefix..'שנתיים'
else
result = prefix..tostring(AgeYears)
end
if BirthDate.precision < dateParser.PRECISION.MONTH or (DeathDate and DeathDate.precision < dateParser.PRECISION.MONTH) then
result = result .. ' בערך'
end
local title = mw.title.getCurrentTitle()
-- ignore warning in other namespace except the main NS
if title.namespace==0 then
if AgeYears > 139 then
table.insert(warnings, Errors['future-date'])
elseif AgeYears>109 then
table.insert(warnings, '[[קאטעגאריע:הונדערט-און-צען-יעריגער]]')
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
}