Content deleted Content added
Fix for decades/centuries/millenniums and other minor edits |
Added option to set time constraints (claim validity) |
||
Line 17:
stt.maxRank = nil
stt.minRank = nil
stt.period = 0
stt.linked = false
Line 39 ⟶ 41:
function State:parseDate(dateStr, precision)
precision = precision or "d"
local i, j,
local parts = {nil, nil, nil}
if dateStr == nil then
return parts[1], parts[2], parts[3] -- year, month, day
end
-- 'T' for snak values, '/' for outputs with '/Julian' attached
i, j = dateStr:find("[T/]")
if i then
dateStr = dateStr:sub(1, i-1)
end
local from = 1
Line 47 ⟶ 61:
from = 2
end
index = 1
ptr = 1
i, j = dateStr:find("-", from)
if i then
-- year
parts[index] = tonumber(mw.ustring.gsub(dateStr:sub(ptr, i-1), "^\+(.+)$", "%1"), 10) -- remove + sign
-- apparently, 0 can have a negative sign in Lua... so do this to get rid of it
if
end
if precision == "y" then
-- we're done
return parts[1], parts[2], parts[3] -- year, month, day
end
index = index + 1
ptr = i + 1
i, j = dateStr:find("-", ptr)
if i then
-- month
parts[index] = tonumber(dateStr:sub(ptr, i-1), 10)
if precision == "m" then
-- we're done
return parts[1], parts[2], parts[3] -- year, month, day
end
index = index + 1
ptr = i + 1
end
end
if
-- day if we have month, month if we have year, or year
parts[index] = tonumber(dateStr:sub(ptr), 10)
end
return parts[1], parts[2], parts[3] -- year, month, day
end
Line 437 ⟶ 454:
else
return self:getValue(snak, false, false)
end
end
function State:getSingleRawQualifier(claim, qualifierID)
local qualifiers
if claim.qualifiers then qualifiers = claim.qualifiers[qualifierID] end
if qualifiers and qualifiers[1] then
return self:getRawValue(qualifiers[1])
else
return nil
end
end
Line 514 ⟶ 543:
else
return (self.maxRank <= rankPos and rankPos <= self.minRank)
end
end
function State:datePrecedesDate(aY, aM, aD, bY, bM, bD)
if aY == nil or bY == nil then
return nil
end
aM = aM or 1
aD = aD or 1
bM = bM or 1
bD = bD or 1
if aY < bY then
return true
end
if aY > bY then
return false
end
if aM < bM then
return true
end
if aM > bM then
return false
end
if aD < bD then
return true
end
return false
end
function State:timeMatches(claim)
local startTimeY = nil
local startTimeM = nil
local startTimeD = nil
local endTimeY = nil
local endTimeM = nil
local endTimeD = nil
if self.period == 0 then
-- any time
return true
end
if self.period <= 2 then
local startTime = self:getSingleRawQualifier(claim, "P580") -- 'start time'
if startTime ~= "" and startTime ~= " " then
startTimeY, startTimeM, startTimeD = self:parseDate(startTime)
end
end
if self.period >= 2 then
local endTime = self:getSingleRawQualifier(claim, "P582") -- 'end time'
if endTime ~= "" and endTime ~= " " then
endTimeY, endTimeM, endTimeD = self:parseDate(endTime)
end
end
local now = os.date('!*t')
if self.period == 1 then
-- future
if startTimeY == nil or not self:datePrecedesDate(now['year'], now['month'], now['day'], startTimeY, startTimeM, startTimeD) then
return false
else
return true
end
elseif self.period == 2 then
-- current
if (startTimeY ~= nil and self:datePrecedesDate(now['year'], now['month'], now['day'], startTimeY, startTimeM, startTimeD)) or
(endTimeY ~= nil and not self:datePrecedesDate(now['year'], now['month'], now['day'], endTimeY, endTimeM, endTimeD)) then
return false
else
return true
end
elseif self.period == 3 then
-- former
if endTimeY == nil or self:datePrecedesDate(now['year'], now['month'], now['day'], endTimeY, endTimeM, endTimeD) then
return false
else
return true
end
end
end
Line 596 ⟶ 710:
elseif flag == "best" or flag == "all" or flag:match('^preferred[+-]?$') or flag:match('^normal[+-]?$') or flag:match('^deprecated[+-]?$') then
self:setRankBoundaries(flag)
return true
elseif flag == "future" then
self.period = 1
return true
elseif flag == "current" then
self.period = 2
return true
elseif flag == "former" then
self.period = 3
return true
else
Line 630 ⟶ 753:
for i, v in ipairs(claims) do
rankPos = _:convertRank(v.rank)
if _:rankMatches(rankPos) and _:timeMatches(v) then
value = _:getValue(v.mainsnak, _.withUnit, _.linked)
if value then
Line 699 ⟶ 822:
rankPos = _:convertRank(v.rank)
if propertyValue == nil or _:snakEqualsValue(v.mainsnak, propertyValue) then
if _:rankMatches(rankPos) and _:timeMatches(v) then
outValue = nil
outInter = nil
|