« Module:Date complexe » : différence entre les versions
Apparence
Modèle:Infobox>Zolo Aucun résumé des modifications |
Modèle:Infobox>Zolo Aucun résumé des modifications |
||
| Ligne 19 : | Ligne 19 : | ||
local function vowelfirst(str) | local function vowelfirst(str) | ||
return linguistic.vowelfirst(str) | return linguistic.vowelfirst(str) | ||
end | |||
local function guessprecision(obj) -- précision des dates qui ne viennent pas de Module:Wikidata/Dates | |||
local prec = 0 | |||
for i, j in pairs(obj) do | |||
if (numericprecision[i] or 0) > prec then | |||
prec = numericprecision[i] | |||
end | |||
end | |||
return prec | |||
end | end | ||
local function centuryString(centurynumber) | local function centuryString(centurynumber) | ||
return mw.getCurrentFrame():expandTemplate{ title = 'Nombre en romain', args = { | return mw.getCurrentFrame():expandTemplate{ title = 'Nombre en romain', args = { centurynumber + 1 }} .. '<sup>e</sup> siècle' | ||
end | |||
local function centuryString(centurynumber) | |||
return mw.getCurrentFrame():expandTemplate{ title = 'Nombre en romain', args = { centurynumber + 1 }} .. '<sup>e</sup> millénaire' | |||
end | end | ||
| Ligne 29 : | Ligne 43 : | ||
end | end | ||
function p.simplestring(dateobject) -- transforme un object date ponctuel en texte | function p.simplestring(dateobject) | ||
-- transforme un object date ponctuel en texte | |||
local | -- les dates de type ISO devraient passer par Module:Date, mais il faut pouvoir désactiver les liens | ||
local yearstr, monthstr, daystr= tostring(dateobject.year), tostring(dateobject.month), tostring(dateobject.day) | |||
-- adaptation à mw.formatDate en attendant de passer par Module:Date | |||
if yearstr then | |||
while #yearstr < 4 do | |||
yearstr = 0 .. yearstr | |||
end | |||
end | |||
local era = dateobject.era | local era = dateobject.era | ||
local precision = dateobject.precision | local precision = dateobject.precision or guessprecision(dateobject) | ||
if | |||
local century = tostring(math.floor(year/100)) | if precision == 6 then | ||
local century = tostring(math.floor(dateobject.year/100)) | |||
str = centuryString(century) | |||
elseif precision == 7 then | |||
local century = tostring(math.floor(dateobject.year/100)) | |||
str = centuryString(century) | str = centuryString(century) | ||
elseif precision == 8 then | elseif precision == 8 then | ||
local decade = tostring(math.floor(year/10)) | local decade = tostring(math.floor(dateobject.year/10)) | ||
str = decadestring(decade) | str = decadestring(decade) | ||
elseif precision == 9 then | elseif precision == 9 then | ||
str = | str = yearstr | ||
elseif precision == 10 then | elseif precision == 10 then | ||
str =mw.language.new('fr'):formatDate('F Y', | str =mw.language.new('fr'):formatDate('F Y', yearstr .. '-' .. monthstr ) | ||
if dateobject.year < 1000 then -- enlève les zéros en trop | |||
str = string.gsub(str, '0', '') | |||
end | |||
elseif precision == 11 then | elseif precision == 11 then | ||
str = mw.language.new('fr'):formatDate('j F Y', | str = mw.language.new('fr'):formatDate('j F Y', yearstr .. '-' .. monthstr .. '-' .. daystr) | ||
if day == 1 then -- ajustement "1 janvier" -> 1er janvier | if day == 1 then -- ajustement "1 janvier" -> 1er janvier | ||
str = string.gsub(t, '1', "1<sup>er</sup>", 1) -- remplacer "1 janvier" par "1er janvier" | str = string.gsub(t, '1', "1<sup>er</sup>", 1) -- remplacer "1 janvier" par "1er janvier" | ||
end | |||
if dateobject.year < 1000 then | |||
str = string.gsub(str, '0', '') | |||
end | end | ||
end | end | ||
| Ligne 53 : | Ligne 86 : | ||
str = str .. ' av. J.-C.' | str = str .. ' av. J.-C.' | ||
end | end | ||
return str | return str or 'date invalide' | ||
end | end | ||
local function fromdate(d) -- retourne "à partir de date" en langage naturel | local function fromdate(d) -- retourne "à partir de date" en langage naturel | ||
local | local precision = d.precision or guessprecision(d) | ||
local datestr = p.simplestring(d) | |||
if | |||
return 'à partir du ' .. | if (precision >= 11) or (precision == 7) or (precision == 6) then -- ont dit "à partir du pour les dates avec jour, les siècles, les millénaires | ||
return 'à partir du ' .. datestr | |||
else | else | ||
if vowelfirst(str) then | if vowelfirst(str) then | ||
return "à partir d'" .. | return "à partir d'" .. datestr | ||
else | else | ||
return 'à partir de ' .. | return 'à partir de ' .. datestr | ||
end | end | ||
end | end | ||
end | end | ||
function | local function upto(d) -- retourne "jusqu'à date' en langage naturel | ||
local datestring = p.simplestring(d) | local datestring = p.simplestring(d) | ||
local precision = d.precision | local precision = d.precision or guessprecision(d) | ||
if (precision >= 11) then | if (precision >= 11) or (precision == 7) or (precision == 6) then --on dit "jusqu'au" pour les dates avec jour, et pour les siècles | ||
return 'jusqu\'au ' .. datestring | return 'jusqu\'au ' .. datestring | ||
elseif (precision >= 9) then | elseif (precision >= 9) then | ||
| Ligne 83 : | Ligne 117 : | ||
local function fromuntil(startpoint, endpoint) | local function fromuntil(startpoint, endpoint) | ||
local precision = endpoint.precision -- may need 2 precisions for start and end dates | local precision = endpoint.precision or guessprecision(endpoint) -- may need 2 precisions for start and end dates | ||
local startstr = p.simplestring(startpoint) | local startstr = p.simplestring(startpoint) | ||
local endstr = p.simplestring(endpoint) | local endstr = p.simplestring(endpoint) | ||
| Ligne 90 : | Ligne 124 : | ||
-- on dit "du 3 au 14 janvier" mais "de septembe à octobre | -- on dit "du 3 au 14 janvier" mais "de septembe à octobre | ||
if precision >= 11 then -- >= day | if precision >= 11 then -- >= day | ||
return "du " .. | return "du " .. startstr .. " au " .. endstr | ||
else | else | ||
if vowelfirst(startstr) then | if vowelfirst(startstr) then | ||
| Ligne 101 : | Ligne 135 : | ||
function p.fuzzydate(dateobjet) | function p.fuzzydate(dateobjet) | ||
local str = simplestring(dateobject) | local str = p.simplestring(dateobject) | ||
return "vers " .. str | return "vers " .. str | ||
end | end | ||
function p.daterange(startpointobject, endpointobject) | function p.daterange(startpointobject, endpointobject) | ||
if startpointobject and endpointobject then | if startpointobject and endpointobject then | ||
return fromuntil(startpointobject, endpointobject) | return fromuntil(startpointobject, endpointobject) | ||
| Ligne 116 : | Ligne 150 : | ||
end | end | ||
end | end | ||
Version du 18 janvier 2015 à 18:25
La documentation pour ce module peut être créée à Module:Date complexe/doc
local datemodule = require('Module:Date')
local linguistic = require('Module:Linguistique')
local p = {}
local numericprecision = { -- convertir les précisions en valeurs numériques = à celles utilisées par Wikidata
gigayear = 0,
megayear = 3,
millenium = 6,
century = 7,
decade = 8,
year = 9,
month = 10,
day = 11,
hour = 12,
minute = 12,
second = 14,
}
local function vowelfirst(str)
return linguistic.vowelfirst(str)
end
local function guessprecision(obj) -- précision des dates qui ne viennent pas de Module:Wikidata/Dates
local prec = 0
for i, j in pairs(obj) do
if (numericprecision[i] or 0) > prec then
prec = numericprecision[i]
end
end
return prec
end
local function centuryString(centurynumber)
return mw.getCurrentFrame():expandTemplate{ title = 'Nombre en romain', args = { centurynumber + 1 }} .. '<sup>e</sup> siècle'
end
local function centuryString(centurynumber)
return mw.getCurrentFrame():expandTemplate{ title = 'Nombre en romain', args = { centurynumber + 1 }} .. '<sup>e</sup> millénaire'
end
local function decadeString(decadenumber)
return 'années ' .. decade .. '0'
end
function p.simplestring(dateobject)
-- transforme un object date ponctuel en texte
-- les dates de type ISO devraient passer par Module:Date, mais il faut pouvoir désactiver les liens
local yearstr, monthstr, daystr= tostring(dateobject.year), tostring(dateobject.month), tostring(dateobject.day)
-- adaptation à mw.formatDate en attendant de passer par Module:Date
if yearstr then
while #yearstr < 4 do
yearstr = 0 .. yearstr
end
end
local era = dateobject.era
local precision = dateobject.precision or guessprecision(dateobject)
if precision == 6 then
local century = tostring(math.floor(dateobject.year/100))
str = centuryString(century)
elseif precision == 7 then
local century = tostring(math.floor(dateobject.year/100))
str = centuryString(century)
elseif precision == 8 then
local decade = tostring(math.floor(dateobject.year/10))
str = decadestring(decade)
elseif precision == 9 then
str = yearstr
elseif precision == 10 then
str =mw.language.new('fr'):formatDate('F Y', yearstr .. '-' .. monthstr )
if dateobject.year < 1000 then -- enlève les zéros en trop
str = string.gsub(str, '0', '')
end
elseif precision == 11 then
str = mw.language.new('fr'):formatDate('j F Y', yearstr .. '-' .. monthstr .. '-' .. daystr)
if day == 1 then -- ajustement "1 janvier" -> 1er janvier
str = string.gsub(t, '1', "1<sup>er</sup>", 1) -- remplacer "1 janvier" par "1er janvier"
end
if dateobject.year < 1000 then
str = string.gsub(str, '0', '')
end
end
if era == '-' then
str = str .. ' av. J.-C.'
end
return str or 'date invalide'
end
local function fromdate(d) -- retourne "à partir de date" en langage naturel
local precision = d.precision or guessprecision(d)
local datestr = p.simplestring(d)
if (precision >= 11) or (precision == 7) or (precision == 6) then -- ont dit "à partir du pour les dates avec jour, les siècles, les millénaires
return 'à partir du ' .. datestr
else
if vowelfirst(str) then
return "à partir d'" .. datestr
else
return 'à partir de ' .. datestr
end
end
end
local function upto(d) -- retourne "jusqu'à date' en langage naturel
local datestring = p.simplestring(d)
local precision = d.precision or guessprecision(d)
if (precision >= 11) or (precision == 7) or (precision == 6) then --on dit "jusqu'au" pour les dates avec jour, et pour les siècles
return 'jusqu\'au ' .. datestring
elseif (precision >= 9) then
return "jusqu'à " .. datestring
else
return "jusqu\'en " .. datestring
end
end
local function fromuntil(startpoint, endpoint)
local precision = endpoint.precision or guessprecision(endpoint) -- may need 2 precisions for start and end dates
local startstr = p.simplestring(startpoint)
local endstr = p.simplestring(endpoint)
-- à améliorer pour éviter les tournures répétitives comme "du 13 septembre 2006 au 18 september 2006"
-- on dit "du 3 au 14 janvier" mais "de septembe à octobre
if precision >= 11 then -- >= day
return "du " .. startstr .. " au " .. endstr
else
if vowelfirst(startstr) then
return "d'" .. startstr .. " à ".. endstr
else
return "de " .. startstr .. " à " .. endstr
end
end
end
function p.fuzzydate(dateobjet)
local str = p.simplestring(dateobject)
return "vers " .. str
end
function p.daterange(startpointobject, endpointobject)
if startpointobject and endpointobject then
return fromuntil(startpointobject, endpointobject)
elseif startpointobject then
return fromdate(startpointobject)
elseif endpointobject then
return upto(endpointobject)
else
return nil
end
end