Module:Wikidata/Dates
Apparence
La documentation pour ce module peut être créée à Module:Wikidata/Dates/doc
-- sert à récupérer des données usuelles sur Wikidata (les fonctions élémentaires pour l'extraction des données se fait sur Module:Wikidata
-- ce module peut-être appelé par Module:InfoboxBuilder/Helpers qui les met en infobox
local formatdate = require( 'Module:Date')
local p = {}
function p.from(d) -- retourne "à partir de date" en langage naturel
if d.year then year = d.year end
if d.month then month = d.month end
if d.day then day = d.day end
if day then
return 'à partir du ' .. datestring
elseif tonumber(month) == 4 or tonumber(month) == 8 or tonumber(month) == 10 then -- mois commençant par une voyelle
return 'à partir d\'' .. datestring
else return
'à partir de ' .. datestring
end
end
function p.todate(d) -- retourne "jusqu'à date' en langage naturel
local year = d.year
local month = d.month
local day = d.day
local datestring = d.datestring
if day then
return 'jusqu\'au ' .. datestring
else return
'jusqu\'à' .. datestring
end
end
function p.rangetotext(begin, ending)
if not begin or not ending then return error end
local beginstring = begin.datestring
local endstring = ending.datestring
if begin.day then day1 = begin.day end
if begin.month then month1 = begin.month end
if begin.year then year1 = begin.year end
if ending.day then day2 = ending.day end
if ending.month then month2 = ending.month end
if ending.year then year2 = ending.year end
if year1 and year2 and (year1 == year2) then -- évite de répéter l'année si c'est deux fois la même
return formatdate.modeleDate({day1, month1}) .. '-' .. endstring
else
return beginstring .. '-' .. endstring
end
end
function p.dateobject(orig) --prend une table de date Wikibase, et la retourne sous un format plus manipulable
local label = orig.label
local timestamp = orig.time
local precision = orig.precision
local era = '+' -- (after Christ)
if string.sub(timestamp,1,1) == '-' or string.sub(timestamp,2,12) == '00000000000' then -- Before Christ or year 0 (see datamodel)
era = '-'
end
local year = nil
local datestring = ''
local calendar = 'gregorian' -- calendar for display, not storage
if orig.calendarmodel == 'http://www.wikidata.org/entity/Q1985786' then
calendar = 'julian'
end
if precision == 7 or precision == 8 then
-- texte spécial pour précision = décennie
--[[ noter que précision = "decade" sur Wikidata, l'équivalenet GUI de precision == 8, ne veut pas forcément dire une décennie ronde
1957, precision = 8 est affiché comme 1950s sur Wikidata, mais il parait préférable de l'afficher comme "vers 1957"
mais que faire pour precision == 7 ?
]]
if mw.ustring.len(timestamp) ~= 28 then -- catégorie temporaire à cause d'un bug wikidata
return {type='dateobject', datestring = [[Catégorie:Date Wikidata au mauvais format]], datestring = datestring}
end
local decade = string.sub(timestamp, 9, 12)
if era == '-' then -- remove one Year for BC years because of year 0
decade = tostring(tonumber(decade) + 1)
end
if string.find(decade, '0') == 1 then -- enlève les zéros au début, à corriger pour enlever 2 zéros si besoin
decade = string.sub(decade, 2, 4)
end
datestring = 'vers ' .. decade
return {type='dateobject', timestamp = timestamp, era= era, calendar=calendar, label=label, datestring = datestring}
end
if precision >= 9 then
year = string.sub(timestamp, 9, 12)
if era == '-' then -- remove one Year for BC years because of year 0
year = tostring(tonumber(year) + 1)
end
end
local month = nil
if precision >= 10 then
month = string.sub(timestamp, 14, 15)
end
local day = nil
if precision >= 11 then
day = string.sub(timestamp, 17, 18)
end
if calendar == 'julian' then
year, month, day = formatdate.gregorianToJulian( era .. year, month, day )
end
datestring = formatdate.modeleDate({day, month, year})
return {type='dateobject', timestamp = timestamp, year=year, month=month, day=day, era= era, calendar=calendar, label=label, datestring = datestring}
end
function p.daterange(date1, date2, label)
if date1 then
if date1.type ~= 'dateobject' then return error end
end
if date2 then
if date2.type ~= 'dateobject' then return error end
end
if date1 and date2 then
if date1.timestamp > date2.timestamp then return error end -- ne pas inverser les dates, c'est sans doute un erreur
end
if date1 then timestamp = date1.timestamp else timestamp = date2.timestamp end
return {type='daterange', timestamp = timestamp, begin = date1, ending = date2, label = label}
end
function p.objecttotext(object, formatting)
text = ''
if object.type == 'dateobject' then
text = text .. object.datestring
elseif object.type == 'daterange' then
if object.begin and object.ending then
text = text .. p.rangetotext(object.begin, object.ending)
elseif object.begin then
text = text .. p.from(object.begin)
elseif object.ending then
text = text .. p.todate(object.ending)
end
else
return error('unknown date object')
end
if formatting and formatting.showlabel == 'true' then
text = text .. ' : ' .. object.label
end
return text
end
function p.duration(range)
if not range.begin and range.ending then
return nil
else
a, b = range.begin, range.ending
end
return formatdate.age(a.year, a.month, a.day, b.year, b.month, b.day)
end
return p