יחידה:גיל לערכי אישים: הבדלים בין גרסאות בדף
מ 5 גרסאות של הדף wikipedia:he:יחידה:גיל_לערכי_אישים יובאו |
|||
| (43 גרסאות ביניים של 11 משתמשים אינן מוצגות) | |||
| שורה 6: | שורה 6: | ||
} | } | ||
function | function ToDate(frame, Date, ApproxDate) | ||
local isValidDate, | local isValidDate, res = pcall(dateParser.newFromWikitext, Date) | ||
local errors = '' | |||
-- invalid | 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, | ['מקורב']=ApproxDate, | ||
['נוסף']=Date, | ['נוסף']=Date, | ||
| שורה 16: | שורה 27: | ||
} } | } } | ||
end | end | ||
if | 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 | end | ||
return isConsistent | |||
end | end | ||
function | function ageCalcFromFrame(frame) | ||
local args = Arguments.getArgs(frame) | local args = Arguments.getArgs(frame, { ['trim'] = true, ['removeBlanks'] = true }) | ||
local | --local age_string = args['מציין'] | ||
local | local BirthDateStr = args['תאריך לידה'] | ||
local DeathDateStr = args['תאריך פטירה'] | |||
local DisplayForAlive = args['הצג אם בחיים'] | local DisplayForAlive = args['הצג אם בחיים'] | ||
local DisplayForDead = args['הצג אם נפטר'] | local DisplayForDead = args['הצג אם נפטר'] | ||
local Brackets = args['סוגריים'] | local Brackets = args['סוגריים'] | ||
local ApproxDate = args['מקורב'] | local ApproxDate = args['מקורב'] | ||
DisplayForAlive = (DisplayForAlive=='כן') | DisplayForAlive = (DisplayForAlive=='כן') | ||
DisplayForDead = (DisplayForDead=='כן') | DisplayForDead = (DisplayForDead=='כן') | ||
Brackets = (Brackets~='לא') | Brackets = (Brackets~='לא') | ||
return ageCalc(BirthDateStr, DeathDateStr, DisplayForAlive, DisplayForDead, Brackets, ApproxDate) | |||
local | end | ||
if | |||
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 | |||
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 | -- validate dates are valid | ||
if | if not BirthDateStr then | ||
return -- missing date, nothing to do | return -- missing date, nothing to do | ||
end | 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) | |||
local IsDead = ( | |||
-- early termination | -- early termination | ||
| שורה 67: | שורה 96: | ||
return '' | return '' | ||
end | 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 | local DeathDate | ||
if IsDead then | if IsDead then | ||
isValidDate, DeathDate, errDate = ToDate(frame, DeathDateStr, ApproxDate) | |||
if | if not isValidDate then | ||
return | return errDate-- invalid death date | ||
end | end | ||
if not consistentWithWikidata(DeathDate, wikidataDeath) then | |||
table.insert(warnings, '[[קטגוריה:דפים עם שנות חיים שלא תואמים את ויקינתונים]]') | |||
end | |||
prefix = 'בגיל ' | prefix = 'בגיל ' | ||
else | 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 | 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 | |||
local | -- 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 | end | ||
else | else | ||
result = '?' .. frame:expandTemplate{ title = 'גיל לערכי אישים/בעיה', args = { | result = '?' .. frame:expandTemplate{ title = 'גיל לערכי אישים/בעיה', args = { | ||
['מקורב']=ApproxDate, | ['מקורב']=ApproxDate, | ||
| שורה 108: | שורה 232: | ||
} } | } } | ||
end | end | ||
warnings = table.concat( warnings, '') | warnings = table.concat( warnings, '') | ||
if #warnings > 0 then | |||
warnings = string.format('%s ', warnings) | |||
end | |||
if Brackets then | if Brackets then | ||
result = string.format(' (%s)', result) | result = string.format(' (%s)', result) | ||
end | end | ||
return string.format('%s <span style="white-space: nowrap;">%s</span>', warnings, result) | return string.format('%s<span style="white-space: nowrap;">%s</span>', warnings, result) | ||
end | end | ||
return { | return { | ||
['גיל'] = ageCalc | ['גיל'] = ageCalcFromFrame, | ||
ageCalc = ageCalc | |||
} | } | ||