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

De Lagny-sur-Marne Wiki
Aller à la navigation Aller à la recherche
0x010D (discussion | contributions)
m corrige erreur décennies, meilleure affichage des dates av-JC
0x010D (discussion | contributions)
ce
Ligne 38 : Ligne 38 :
end
end


local function centuryString(century, era)
 
local str = roman.toRoman(century) .. '<sup>e</sup> siècle'
local function milleniumString(millenium, era, hideera)
if era == '-' then
local str = roman.toRoman(millenium) .. '<sup>e</sup> millénaire'
if era == '-' and (not hideera) then
str = str .. ' av. J.-C.'
str = str .. ' av. J.-C.'
end
end
return '' -- trop d'erreurs sur Wikidata, en attente du UI correcte
return str
end
end


local function milleniumString(millenium, era)
local function centuryString(century, era, hideera)
local str = roman.toRoman(millenium) .. '<sup>e</sup> millénaire'
local str = roman.toRoman(century) .. '<sup>e</sup> siècle'
if era == '-' then
if era == '-' and (not hideera) then
str = str .. ' av. J.-C.'
str = str .. ' av. J.-C.'
end
end
return str
return '' -- trop d'erreurs sur Wikidata, en attente du UI correcte
end
end


local function decadeString(decade, era)
local function decadeString(decade, era, hideera)
local str = 'années ' .. decade .. '0'
local str = 'années ' .. decade .. '0'
if era == '-' then
if era == '-' and (not hideera) then
str = str .. ' av. J.-C.'
str = str .. ' av. J.-C.'
end
end
Ligne 78 : Ligne 79 :
nolinks = true
nolinks = true
end
end
local str
local str
local precision = setprecision(dateobject, displayformat.precision)
local precision = setprecision(dateobject, displayformat.precision)
Ligne 83 : Ligne 85 :
-- formats gérés par ce module
-- formats gérés par ce module
if precision == 6 then
if precision == 6 then
local millenium = math.floor(dateobject.year/1000)
local millenium = math.floor(dateobject.year/1000) + 1
if era ~= '-' then
str = milleniumString(millenium, era, hideera)
millenium = millenium + 1
end
str = milleniumString(millenium, era)
elseif precision == 7 then
elseif precision == 7 then
local century = math.floor(dateobject.year/100) + 1
local century = math.floor(dateobject.year/100) + 1
str = centuryString(century, era)
str = centuryString(century, era, hideera)
elseif precision == 8 then
elseif precision == 8 then
local decade = tostring(math.floor(dateobject.year/10))
local decade = tostring(math.floor(dateobject.year/10))
str = decadeString(decade, era)
str = decadeString(decade, era, hideera)
end
end
if str then
if str then
Ligne 100 : Ligne 99 :
-- formats gérés par Module:Date
-- formats gérés par Module:Date
local yearstr, monthstr, daystr = tostring((era or '+') .. dateobject.year), tostring(dateobject.month), tostring(dateobject.day)
local yearstr = tostring((era) .. (dateobject.year or ''))
if (yearstr == '+') or (yearstr == '-') then
yearstr = nil
end
local monthstr, daystr = tostring(dateobject.month), tostring(dateobject.day)
local avJC -- équivalent de hideera pour modeleDate
if displayformat.hideera then
avJC = 'non'
end
if precision == 9 then
if precision == 9 then
str = datemodule.modeleDate{nil, nil, yearstr, linktopic, nolinks = nolinks}
str = datemodule.modeleDate{nil, nil, yearstr, linktopic, nolinks = nolinks, avJC = avJC }
elseif precision == 10 then
elseif precision == 10 then
daystr = nil
daystr = nil
str = datemodule.modeleDate{nil, monthstr, yearstr, linktopic, nolinks = nolinks}
str = datemodule.modeleDate{nil, monthstr, yearstr, linktopic, nolinks = nolinks, avJC = avJC}
else
else
str = datemodule.modeleDate{daystr, monthstr, yearstr, linktopic, nolinks = nolinks}
str = datemodule.modeleDate{daystr, monthstr, yearstr, linktopic, nolinks = nolinks, avJC = avJC}
end
end
return str
return str
Ligne 163 : Ligne 170 :
if startpoint.era == endpoint.era then
if startpoint.era == endpoint.era then
sameera = true
sameera = true
startpoint.era = nil
end
endpoint.era = nil
if era == '-' then
displayformat.linktopic = '-' -- pour éviter de lier à la mauvaise année
end
end
if (precision or 0) > 9 and (endpoint.year == startpoint.year) then
if (endpoint.year == startpoint.year) then
startpoint.year = nil
startpoint.year = nil
if (startpoint.month == endpoint.month) then
startpoint.month = nil
if (startpoint.day == endpoint.day) then
startpoint.day = nil
end
end
end
end
return startpoint, endpoint, era
return startpoint, endpoint, era, displayformat, sameera
end
end


Ligne 180 : Ligne 188 :


  -- analyse les paramètres pour éviter les redondances
  -- analyse les paramètres pour éviter les redondances
local startpoint, endpoint, era, sameera = removeclutter(startpoint, endpoint, precision, displayformat)
local startpoint, endpoint, era, displayformat, sameera = removeclutter(startpoint, endpoint, precision, displayformat)


local startstr = p.simplestring(startpoint, displayformat)
displayformat.hideera = true
local endstr = p.simplestring(endpoint, displayformat)
if sameera and (startstr == endstr) and ok then
local startstr, endstr = p.simplestring(startpoint, displayformat), p.simplestring(endpoint, displayformat)
return startstr
if (startstr == '') or (startstr == endstr) then
if (not sameera) then
displayformat.hideera = false --sinon c'est incompréhensible
return p.simplestring(endpoint, displayformat)
end
return endstr
end
end
-- à améliorer pour éviter les tournures répétitives comme  "du 13 septembre 2006 au 18 september 2006"
-- à améliorer pour éviter les tournures répétitives comme  "du 13 septembre 2006 au 18 september 2006"
Ligne 208 : Ligne 222 :
end
end


function p.daterange(startpoint, endpoint, displayformat)  
function p.daterange(startpoint, endpoint, displayformat)
if startpoint and endpoint then
if startpoint and endpoint then
return fromuntil(startpoint, endpoint, displayformat)
return fromuntil(startpoint, endpoint, displayformat)

Version du 23 juillet 2015 à 14:26

-- 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 milleniumString(millenium, era, hideera) local str = roman.toRoman(millenium) .. 'e millénaire' if era == '-' and (not hideera) then str = str .. ' av. J.-C.' end return str end

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

local function decadeString(decade, era, hideera) local str = 'années ' .. decade .. '0' if era == '-' and (not hideera) 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) + 1 str = milleniumString(millenium, era, hideera) elseif precision == 7 then local century = math.floor(dateobject.year/100) + 1 str = centuryString(century, era, hideera) elseif precision == 8 then local decade = tostring(math.floor(dateobject.year/10)) str = decadeString(decade, era, hideera) end if str then return str end

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

local avJC -- équivalent de hideera pour modeleDate if displayformat.hideera then avJC = 'non' end if precision == 9 then str = datemodule.modeleDate{nil, nil, yearstr, linktopic, nolinks = nolinks, avJC = avJC } elseif precision == 10 then daystr = nil str = datemodule.modeleDate{nil, monthstr, yearstr, linktopic, nolinks = nolinks, avJC = avJC} else str = datemodule.modeleDate{daystr, monthstr, yearstr, linktopic, nolinks = nolinks, avJC = avJC} 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 end if (endpoint.year == startpoint.year) then startpoint.year = nil if (startpoint.month == endpoint.month) then startpoint.month = nil if (startpoint.day == endpoint.day) then startpoint.day = nil end end end return startpoint, endpoint, era, displayformat, sameera 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, displayformat, sameera = removeclutter(startpoint, endpoint, precision, displayformat)

displayformat.hideera = true

local startstr, endstr = p.simplestring(startpoint, displayformat), p.simplestring(endpoint, displayformat) if (startstr == ) or (startstr == endstr) then if (not sameera) then displayformat.hideera = false --sinon c'est incompréhensible return p.simplestring(endpoint, displayformat) end return endstr 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