« Module:Date complexe » : différence entre les versions

De Lagny-sur-Marne Wiki
Aller à la navigation Aller à la recherche
0x010D (discussion | contributions)
mAucun résumé des modifications
0x010D (discussion | contributions)
m corrige erreur décennies, meilleure affichage des dates av-JC
Ligne 89 : Ligne 89 :
str = milleniumString(millenium, era)
str = milleniumString(millenium, era)
elseif precision == 7 then
elseif precision == 7 then
local century = math.floor(dateobject.year/100)
local century = math.floor(dateobject.year/100) + 1
if era ~= '-' then
century = century + 1
end
str = centuryString(century, era)
str = centuryString(century, era)
elseif precision == 8 then
elseif precision == 8 then
local decade = tostring(math.floor(dateobject.year/10))
local decade = tostring(math.floor(dateobject.year/10))
if era ~= '-' then
decade = decade + 1
end
str = decadeString(decade, era)
str = decadeString(decade, era)
end
end
Ligne 148 : Ligne 142 :
end
end


local function fromuntillong(startstr, endstr) -- inutile ?
local function fromuntillong(startstr, endstr, era)
-- 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 " .. startstr .. " au " ..  endstr
return "du " .. startstr .. " au " ..  endstr .. era
else
else
if vowelfirst(startstr) then
if vowelfirst(startstr) then
return "d'" .. startstr .. " à ".. endstr
return "d'" .. startstr .. " à ".. endstr .. era
else
else
return "de " .. startstr .. " à " .. endstr
return "de " .. startstr .. " à " .. endstr .. era
end
end
end
end
end
local function removeclutter(startpoint, endpoint, precision, displayformat) -- prépare à rendre la date plus jolie : "juin 445 av-JC-juillet 445 av-JC -> juin-juillet 445-av-JC"
if (type(startpoint) ~= 'table') or (type(endpoint) ~= 'table') then
return startpoint, endpoint, precision, displayformat
end
local era = endpoint.era
local sameera
if startpoint.era == endpoint.era then
sameera = true
startpoint.era = nil
end
endpoint.era = nil
if era == '-' then
displayformat.linktopic = '-' -- pour éviter de lier à la mauvaise année
end
if (precision or 0) > 9 and (endpoint.year == startpoint.year) then
startpoint.year = nil
end
return startpoint, endpoint, era
end
end


local function fromuntil(startpoint, endpoint, displayformat)
local function fromuntil(startpoint, endpoint, displayformat)
displayformat = displayformat or {}
local precision = setprecision(displayformat, endpoint)
local precision = setprecision(displayformat, endpoint)
-- analyse les paramètres pour éviter les redondances
local startpoint, endpoint, era, sameera = removeclutter(startpoint, endpoint, precision, displayformat)
local startstr = p.simplestring(startpoint, displayformat)
local startstr = p.simplestring(startpoint, displayformat)
local endstr = p.simplestring(endpoint, displayformat)
local endstr = p.simplestring(endpoint, displayformat)
if (startstr == endstr) then
if sameera and (startstr == endstr) and ok then
return startstr
return startstr
end
end
Ligne 171 : Ligne 190 :
if not params then
if not params then
params = {}
params = {}
end
if era == '-' then
era = ' av J-C'
else
era = ''
end
end
if params.displayformat == 'long' then
if params.displayformat == 'long' then
return fromuntillong(startstr, endstr)
return fromuntillong(startstr, endstr, era)
else
else
return startstr .. '-' .. endstr
return startstr .. '-' .. endstr .. era
end
end
end
end

Version du 23 juillet 2015 à 09:21

-- TODO: améliorer les synergies avec Module:Date (gestion par module:Date de dates sans lien et de "XIe siècle en astronautique"

local datemodule = require 'Module:Date' local linguistic = require 'Module:Linguistique' local roman = require 'Module:Romain' 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 setprecision(obj, maxprecision) if (not obj) or (type(obj) == 'string') then return obj end local precision = tonumber(obj.precision) or numericprecision[obj.precision] if maxprecision then maxprecision = tonumber(maxprecision) or numericprecision[maxprecision] end if maxprecision then return math.min(precision, maxprecision) end return precision end

local function centuryString(century, era) local str = roman.toRoman(century) .. 'e siècle' if era == '-' then str = str .. ' av. J.-C.' end return -- trop d'erreurs sur Wikidata, en attente du UI correcte end

local function milleniumString(millenium, era) local str = roman.toRoman(millenium) .. 'e millénaire' if era == '-' then str = str .. ' av. J.-C.' end return str end

local function decadeString(decade, era) local str = 'années ' .. decade .. '0' if era == '-' then str = str .. ' av. J.-C.' end return str end

function p.simplestring(dateobject, displayformat) -- 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 if type(dateobject) == 'string' or type(dateobject) == 'nil' then return dateobject end local era = dateobject.era

if not displayformat then displayformat = {} end local linktopic = displayformat.linktopic local nolinks if linktopic == '-' then nolinks = true end local str local precision = setprecision(dateobject, displayformat.precision)

-- formats gérés par ce module if precision == 6 then local millenium = math.floor(dateobject.year/1000) if era ~= '-' then millenium = millenium + 1 end str = milleniumString(millenium, era) elseif precision == 7 then local century = math.floor(dateobject.year/100) + 1 str = centuryString(century, era) elseif precision == 8 then local decade = tostring(math.floor(dateobject.year/10)) str = decadeString(decade, era) end if str then return str end

-- formats gérés par Module:Date local yearstr, monthstr, daystr = tostring((era or '+') .. dateobject.year), tostring(dateobject.month), tostring(dateobject.day)

if precision == 9 then str = datemodule.modeleDate{nil, nil, yearstr, linktopic, nolinks = nolinks} elseif precision == 10 then daystr = nil str = datemodule.modeleDate{nil, monthstr, yearstr, linktopic, nolinks = nolinks} else str = datemodule.modeleDate{daystr, monthstr, yearstr, linktopic, nolinks = nolinks} end return str end

local function fromdate(d, displayformat) -- retourne "à partir de date" en langage naturel local precision = setprecision(d, displayformat) local datestr = p.simplestring(d, displayformat, precision) if displayformat and displayformat.textformat == 'minimum' then return datestr -- par exemple pour les classements MH, juste afficher la date de début end 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, displayformat) -- retourne "jusqu'à date' en langage naturel local datestring = p.simplestring(d, displayformat) local precision = setprecision(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 fromuntillong(startstr, endstr, era) -- on dit "du 3 au 14 janvier" mais "de septembe à octobre if precision >= 11 then -- >= day return "du " .. startstr .. " au " .. endstr .. era else if vowelfirst(startstr) then return "d'" .. startstr .. " à ".. endstr .. era else return "de " .. startstr .. " à " .. endstr .. era end end end

local function removeclutter(startpoint, endpoint, precision, displayformat) -- prépare à rendre la date plus jolie : "juin 445 av-JC-juillet 445 av-JC -> juin-juillet 445-av-JC" if (type(startpoint) ~= 'table') or (type(endpoint) ~= 'table') then return startpoint, endpoint, precision, displayformat end local era = endpoint.era local sameera if startpoint.era == endpoint.era then sameera = true startpoint.era = nil end endpoint.era = nil if era == '-' then displayformat.linktopic = '-' -- pour éviter de lier à la mauvaise année end if (precision or 0) > 9 and (endpoint.year == startpoint.year) then startpoint.year = nil end return startpoint, endpoint, era end

local function fromuntil(startpoint, endpoint, displayformat) displayformat = displayformat or {} local precision = setprecision(displayformat, endpoint)

	-- analyse les paramètres pour éviter les redondances

local startpoint, endpoint, era, sameera = removeclutter(startpoint, endpoint, precision, displayformat)

local startstr = p.simplestring(startpoint, displayformat) local endstr = p.simplestring(endpoint, displayformat) if sameera and (startstr == endstr) and ok then return startstr end -- à améliorer pour éviter les tournures répétitives comme "du 13 septembre 2006 au 18 september 2006" if not params then params = {} end if era == '-' then era = ' av J-C' else era = end if params.displayformat == 'long' then return fromuntillong(startstr, endstr, era) else return startstr .. '-' .. endstr .. era end end

function p.fuzzydate(dateobjet, displayformat) local str = p.simplestring(dateobject, displayformat) return "vers " .. str end

function p.daterange(startpoint, endpoint, displayformat) if startpoint and endpoint then return fromuntil(startpoint, endpoint, displayformat) elseif startpoint then return fromdate(startpoint, displayformat) elseif endpoint then return upto(endpoint, displayformat) else return nil end end

function p.duration(start, ending) if (not start) or (not ending) then return nil -- ? end return datemodule.age(start.year, start.month, start.day, ending.year, ending.month, ending.day) end return p