Vous ne voulez rien rater de la seconde édition du Tour de France Femmes, vous êtes en vacances et vous profiteriez bien d’une petite sieste post-déjeuner ? Vous regardez la Grande Boucle d’un œil au bureau ? Notre guide de la sieste va sauver le sommeil de la fin de votre mois de juillet.
Pour les huit étapes du parcours officiel, nous avons recensé les sprints, les ascensions et les moments de tension (l’approche de la fin d’une étape ou avant une éventuelle bordure, par exemple) pour créer une chronologie prévisionnelle des moments à ne pas rater du 23 au 30 juillet. A l’inverse, nous avons identifié les temps potentiellement plus faibles, parfaits pour planifier un petit sieston, puisque c’est une pratique vertueuse (même si vous êtes au bureau, rappelons-le).
Une mise en garde néanmoins : si, grâce à l’analyse du parcours, nous pouvons prévoir les longues étapes de plaine, il nous est impossible d’anticiper une échappée pleine de panache, l’explosion en vol d’une sprinteuse en montagne ou encore une bordure inattendue entre Albi et Blagnac.
Nouveauté 2023 : comme chez les messieurs, nous avons ajouté la possibilité d’importer les moments forts dans votre calendrier numérique et ainsi de vous préparer des rappels, comme autant de réveils de la sieste.
Les lignes représentent la difficulté des ascensions, et non pas le profil exact de l'étape.
Temps faible
Sprint intermédiaire
Temps fort
Ascension
Sources : ASO, La Flamme rouge
`;
document.body.appendChild(tooltip)
tooltip.style.top = this.getBoundingClientRect().top - this.getBoundingClientRect().height + window.scrollY - (tooltip.offsetHeight + decalY) + 'px'
tooltip.style.left = this.getBoundingClientRect().left + this.getBoundingClientRect().width / 2 - ((tooltip.getBoundingClientRect().width / 2) - decalX) + 'px'
tooltip.addEventListener('click', () => this.remove());
})
elmt.addEventListener('mouseout', function() {
let tooltip = document.querySelector('.tooltipdecodeurs');
if (tooltip != null)
tooltip.remove()
})
})
}
const suisse = "",
belgique = "",
danemark = "",
espagne = "",
etapes = {
"1": { "nom": "Clermont-Ferrand → Clermont-Ferrand", "type": "plat", "date": "23/07/2023", "distance": 123.8, "deniv": 1044, "rabe": "", "depart": "12:30", "arrivee": "15:36", "text_arr": "15:30" },
"2": { "nom": "Clermont-Ferrand → Mauriac", "type": "accidentée", "date": "24/07/2023", "distance": 151.7, "deniv": 2422, "rabe": "", "depart": "13:05", "arrivee": "17:45", "text_arr": "17:40" },
"3": { "nom": "Collonges-la-Rouge → Montignac-Lascaux", "type": "plat", "date": "25/07/2023", "distance": 147.2, "deniv": 1846, "rabe": "", "depart": "13:45", "arrivee": "17:45", "text_arr": "17:40" },
"4": { "nom": "Cahors → Rodez", "type": "accidentée", "date": "26/07/2023", "distance": 177.1, "deniv": 2503, "rabe": "", "depart": "12:40", "arrivee": "17:44", "text_arr": "17:40" },
"5": { "nom": "Onet-le-Château → Albi", "type": "plat", "date": "27/07/2023", "distance": 126.1, "deniv": 1722, "rabe": "", "depart": "14:20", "arrivee": "17:39", "text_arr": "17:30" },
"6": { "nom": "Albi → Blagnac", "type": "plat", "date": "28/07/2023", "distance": 122.1, "deniv": 1162, "rabe": "", "depart": "14:30", "arrivee": "17:38", "text_arr": "17:30" },
"7": { "nom": "Lannemezan → Tourmalet Bagnères-de-Bigorre", "type": "montagne", "date": "29/07/2023", "distance": 89.8, "deniv": 2613, "rabe": "", "depart": "16:25", "arrivee": "19:25", "text_arr": "19:20" },
"8": { "nom": "Pau → Pau", "type": "contre-la-montre", "date": "30/07/2023", "distance": "22.6", "deniv": 198, "rabe": "", "depart": "14:30", "arrivee": "17:30", "text_arr": "17:30" }
};
moment.locale('fr', {
months: "janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),
monthsShort: "janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),
weekdays: "dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),
weekdaysShort: "dim._lun._mar._mer._jeu._ven._sam.".split("_"),
weekdaysMin: "Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),
longDateFormat: {
LT: "HH:mm",
LTS: "HH:mm:ss",
L: "DD/MM/YYYY",
LL: "D MMMM YYYY",
LLL: "D MMMM YYYY LT",
LLLL: "dddd D MMMM YYYY LT"
},
calendar: {
sameDay: "[Aujourd'hui à] LT",
nextDay: '[Demain à] LT',
nextWeek: 'dddd [à] LT',
lastDay: '[Hier à] LT',
lastWeek: 'dddd [dernier à] LT',
sameElse: 'L'
},
ordinalParse: /\d{1}(er)/,
ordinal: function(number) {
return number + (number === 1 ? 'er' : '');
}
});
var data = [{ "etape": 1, "quoi": "sieste", "nom": "", "km": "", "debut": "12:30", "fin": "14:42", "rabe": "" },
{ "etape": 1, "quoi": "sprint", "nom": "Saint-Hippolyte", "km": "97.1", "debut": "14:42", "fin": "14:56", "rabe": "" },
{ "etape": 1, "quoi": "sieste", "nom": "", "km": "", "debut": "14:56", "fin": "15:00", "rabe": "" },
{ "etape": 1, "quoi": "cat3", "nom": "Côte de Durtol", "km": "114.5", "debut": "15:00", "fin": "15:22", "rabe": "1,7 km à 7,2 %" },
{ "etape": 1, "quoi": "arrivée", "nom": "Arrivée à Clermont-Ferrand (Puy-de-Dôme)", "km": "123.8", "debut": "15:22", "fin": "15:36", "rabe": "" },
{ "etape": 2, "quoi": "sieste", "nom": "", "km": "", "debut": "13:05", "fin": "14:30", "rabe": "" },
{ "etape": 2, "quoi": "cat4", "nom": "Côte du Mont-Dore", "km": "42.6", "debut": "14:30", "fin": "14:40", "rabe": "1,3 km à 6,6 %" },
{ "etape": 2, "quoi": "cat4", "nom": "Côte de la Stèle", "km": "51", "debut": "14:40", "fin": "14:52", "rabe": "1,8 km à 5,1 %" },
{ "etape": 2, "quoi": "sieste", "nom": "", "km": "", "debut": "14:52", "fin": "16:00", "rabe": "" },
{ "etape": 2, "quoi": "cat2", "nom": "Côte des Plaines (630 m)", "km": "105.1", "debut": "16:00", "fin": "16:20", "rabe": "4,5 km à 5,5 %" },
{ "etape": 2, "quoi": "cat4", "nom": "Côte des Broissières", "km": "108.4", "debut": "16:20", "fin": "16:31", "rabe": "1,2 km à 7,2 %" },
{ "etape": 2, "quoi": "sprint", "nom": "Mauriac", "km": "112.6", "debut": "16:31", "fin": "16:38", "rabe": "" },
{ "etape": 2, "quoi": "cat4", "nom": "Côte de Merlhac", "km": "128.6", "debut": "16:38", "fin": "17:05", "rabe": "1,9 km à 5,5 %" },
{ "etape": 2, "quoi": "cat3", "nom": "Côte de Trébiac", "km": "150.3", "debut": "17:05", "fin": "17:20", "rabe": "3,4 km à 5,8 %" },
{ "etape": 2, "quoi": "arrivée", "nom": "Arrivée à Mauriac (Cantal)", "km": "151.7", "debut": "17:20", "fin": "17:45", "rabe": "" },
{ "etape": 3, "quoi": "sieste", "nom": "", "km": "", "debut": "13:45", "fin": "14:20", "rabe": "" },
{ "etape": 3, "quoi": "cat3", "nom": "Côte du Peyroux", "km": "27.2", "debut": "14:20", "fin": "14:29", "rabe": "4,8 km à 4 %" },
{ "etape": 3, "quoi": "cat4", "nom": "Côte du Pératel", "km": "30.9", "debut": "14:29", "fin": "14:35", "rabe": "2 km à 5,3 %" },
{ "etape": 3, "quoi": "sieste", "nom": "", "km": "", "debut": "14:35", "fin": "15:00", "rabe": "" },
{ "etape": 3, "quoi": "cat4", "nom": "Côte de l'Escurotte", "km": "58.1", "debut": "15:00", "fin": "15:19", "rabe": "2,6 km à 4,7 %" },
{ "etape": 3, "quoi": "sieste", "nom": "", "km": "", "debut": "15:19", "fin": "15:50", "rabe": "" },
{ "etape": 3, "quoi": "cat4", "nom": "Côte des Andrieux", "km": "89.4", "debut": "15:50", "fin": "16:05", "rabe": "2,6 km à 4,1 %" },
{ "etape": 3, "quoi": "cat4", "nom": "Côte de Saint-Robert", "km": "92.2", "debut": "16:05", "fin": "16:15", "rabe": "1,1 km à 6,2 %" },
{ "etape": 3, "quoi": "sieste", "nom": "", "km": "", "debut": "16:15", "fin": "16:43", "rabe": "" },
{ "etape": 3, "quoi": "sprint", "nom": "Badefols-d'Ans", "km": "121.4", "debut": "16:43", "fin": "17:02", "rabe": "" },
{ "etape": 3, "quoi": "20km", "nom": "", "km": "127.20", "debut": "17:02", "fin": "17:20", "rabe": "" },
{ "etape": 3, "quoi": "arrivée", "nom": "Arrivée à Collonges-la-Rouge (Corrèze)", "km": "147.20", "debut": "17:20", "fin": "17:44", "rabe": "" },
{ "etape": 4, "quoi": "sieste", "nom": "", "km": "", "debut": "12:40", "fin": "13:00", "rabe": "" },
{ "etape": 4, "quoi": "cat4", "nom": "Côte de Crayssac", "km": "16.5", "debut": "13:00", "fin": "13:08", "rabe": "2,3 km à 4,8 %" },
{ "etape": 4, "quoi": "sieste", "nom": "", "km": "", "debut": "13:08", "fin": "14:45", "rabe": "" },
{ "etape": 4, "quoi": "cat4", "nom": "Côte de Falgeyras", "km": "84.9", "debut": "14:45", "fin": "15:06", "rabe": "3 km à 4 %" },
{ "etape": 4, "quoi": "sieste", "nom": "", "km": "", "debut": "15:06", "fin": "16:00", "rabe": "" },
{ "etape": 4, "quoi": "sprint", "nom": "Rignac", "km": "130.6", "debut": "16:00", "fin": "16:24", "rabe": "" },
{ "etape": 4, "quoi": "cat3", "nom": "Côte de Colombès", "km": "142.7", "debut": "16:24", "fin": "16:44", "rabe": "6,5 km à 4,2 %" },
{ "etape": 4, "quoi": "cat2", "nom": "Côte de Moyrazès (722 m)", "km": "161.7", "debut": "16:44", "fin": "17:15", "rabe": "4,6 km à 5,5 %" },
{ "etape": 4, "quoi": "cat3", "nom": "Côte de Lavernhe", "km": "168.20", "debut": "17:15", "fin": "17:28", "rabe": "2,2 km à 7,1 %" },
{ "etape": 4, "quoi": "arrivée", "nom": "Arrivée à Rodez (Aveyron)", "km": "177.1", "debut": "17:28", "fin": "17:44", "rabe": "" },
{ "etape": 5, "quoi": "sieste", "nom": "", "km": "", "debut": "14:20", "fin": "16:00", "rabe": "" },
{ "etape": 5, "quoi": "cat3", "nom": "Côte de Najac", "km": "74.9", "debut": "16:00", "fin": "16:20", "rabe": "2,1 km à 7,4 %" },
{ "etape": 5, "quoi": "cat3", "nom": "Côte de Laguépie", "km": "85.2", "debut": "16:20", "fin": "16:40", "rabe": "1,5 km à 9 %" },
{ "etape": 5, "quoi": "sprint", "nom": "Monestiés", "km": "99.8", "debut": "16:40", "fin": "16:50", "rabe": "" },
{ "etape": 5, "quoi": "cat4", "nom": "Côte de Monestiés", "km": "102.2", "debut": "16:50", "fin": "17:01", "rabe": "1,6 km à 6,4 %" },
{ "etape": 5, "quoi": "20km", "nom": "", "km": "106.1", "debut": "17:01", "fin": "17:15", "rabe": "" },
{ "etape": 5, "quoi": "arrivée", "nom": "Arrivée à Albi (Tarn)", "km": "126.1", "debut": "17:15", "fin": "17:39", "rabe": "" },
{ "etape": 6, "quoi": "sieste", "nom": "", "km": "", "debut": "14:30", "fin": "15:10", "rabe": "" },
{ "etape": 6, "quoi": "cat4", "nom": "Côte de la Cadène", "km": "30.9", "debut": "15:10", "fin": "15:17", "rabe": "2,5 km à 4,5 %" },
{ "etape": 6, "quoi": "sieste", "nom": "", "km": "", "debut": "15:17", "fin": "15:38", "rabe": "" },
{ "etape": 6, "quoi": "cat4", "nom": "Côte de Puycelsi", "km": "51.3", "debut": "15:38", "fin": "15:50", "rabe": "1,8 km à 6 %" },
{ "etape": 6, "quoi": "cat4", "nom": "Côte du Clos Pourtié", "km": "58", "debut": "15:50", "fin": "16:00", "rabe": "2,6 km à 4,8 %" },
{ "etape": 6, "quoi": "sieste", "nom": "", "km": "", "debut": "16:00", "fin": "16:20", "rabe": "" },
{ "etape": 6, "quoi": "cat4", "nom": "Côte de la Gayre", "km": "81.8", "debut": "16:20", "fin": "16:40", "rabe": "1 km à 4,9 %" },
{ "etape": 6, "quoi": "sprint", "nom": "Hameau de Rastel", "km": "92.5", "debut": "16:40", "fin": "16:59", "rabe": "" },
{ "etape": 6, "quoi": "20km", "nom": "", "km": "102.1", "debut": "16:59", "fin": "17:20", "rabe": "" },
{ "etape": 6, "quoi": "arrivée", "nom": "Arrivée à Blagnac (Haute-Garonne)", "km": "122.1", "debut": "17:20", "fin": "17:38", "rabe": "" },
{ "etape": 7, "quoi": "sieste", "nom": "", "km": "", "debut": "16:25", "fin": "17:19", "rabe": "" },
{ "etape": 7, "quoi": "sprint", "nom": "Sarrancolin", "km": "41.7", "debut": "17:19", "fin": "17:22", "rabe": "" },
{ "etape": 7, "quoi": "cat1", "nom": "Col d'Aspin (1 490 m)", "km": "60.1", "debut": "17:22", "fin": "18:14", "rabe": "12 km à 6,5 %" },
{ "etape": 7, "quoi": "suivre", "nom": "", "km": "", "debut": "18:14", "fin": "18:30", "rabe": "" },
{ "etape": 7, "quoi": "hc", "nom": "Arrivée au Tourmalet (2 110 m)", "km": "89.8", "debut": "18:30", "fin": "19:25", "rabe": "17 km à 7,3 %" },
{ "etape": 8, "quoi": "sieste", "nom": "", "km": "", "debut": "14:30", "fin": "16:30", "rabe": "" },
{ "etape": 8, "quoi": "suivre", "nom": "Départ des coureuses du haut de tableau", "km": "", "debut": "16:30", "fin": "17:00", "rabe": "" },
{ "etape": 8, "quoi": "arrivée", "nom": "Arrivée des dernières coureuses à Pau", "km": "22.6", "debut": "17:00", "fin": "17:30", "rabe": "" }
];
var dico = {
"sieste": {
"trad": "Sieste",
"couleur": "#cecece"
},
"pave": {
"trad": "Secteur pavé"
},
"hc": {
"trad": "hors catégorie",
"couleur": "#a50f15",
"picto": "HC",
"taille": 6
},
"cat1": {
"trad": "de première catégorie",
"couleur": "#ef3b2c",
"picto": "1",
"taille": 5
},
"cat2": {
"trad": "de deuxième catégorie",
"couleur": "#fb6a4a",
"picto": "2",
"taille": 4
},
"cat3": {
"trad": "de troisième catégorie",
"couleur": "#fc9272",
"picto": "3",
"taille": 3
},
"cat4": {
"trad": "de quatrième catégorie",
"couleur": "#fcbba1",
"picto": "4",
"taille": 2
},
"sprint": {
"trad": "Sprint intermédiaire",
"couleur": "#5DB142",
"picto": "S"
},
"20km": {
"trad": "derniers kilomètres de l'étape",
"couleur": "#a1a8ad"
},
"10km": {
"trad": "derniers kilomètres de l'étape",
"couleur": "#a1a8ad"
},
"arrivée": {
"trad": "Fin de l'étape ",
"couleur": "#788289"
},
"suivre": {
"trad": "Tranche à suivre"
},
"départ": {
"trad": "Départ",
"couleur": "#788289"
}
},
cols = ["cat1", "cat2", "cat3", "cat4", "hc"],
plat = [1, 2, 3, 4, 5, 6, 7, 8],
corresArrivee = {};
var chevron = '',
doigt = '';
/* fonction pour l'affichage de l'heure */
function aLaBonneHeure(heure) {
return heure.replace(":", " h ").replace("h 00", "h")
}
function nettoyer(str) {
return str.replace(/[&\/\\#,+()$~%.'":*?{}éàôïëêèç]/g, '').replace(/ /g, "").toLowerCase();
}
function milliers(num) {
resultat = num
if (num = 1000000) {
resultat = String((num / 1000000).toFixed(1)).replace(".", ",").replace(",0", "") + " million" + ((num >= 2000000) ? "s" : "") + " d'"
}
return resultat;
}
/* boucle pour trouver les étapes plates (côtes en dessous de la 2e catégorie) */
for (const [i, d] of data.entries()) {
/* et on checke l'altitude de l'arrivée */
if (i 0) {
f = data[i - 1];
if (d.etape != f.etape && dico[f.quoi].taille) {
corresArrivee[f.etape] = dico[f.quoi].taille;
}
}
if (d.quoi == "cat2" || d.quoi == "cat1" || d.quoi == "hc") {
oudonc = plat.indexOf(d.etape)
if (oudonc != -1) {
/* si on a du gros col, on vire de la liste*/
plat.splice(oudonc, 1);
}
}
}
const finDuTour = moment(etapes[8].date, "DD/MM/YYYY").hours(18).minutes(30);
var combien = Object.keys(etapes).length,
largeur = document.getElementById("sieste2023").offsetWidth,
hauteur = largeur / 6,
hauteurbarre = hauteur / 7,
hauteurgraphe = hauteur / 1.8,
tps = d3.timeParse("%H:%M"),
radius = 5,
mobile = false,
quelleCourbe = d3.curveStep,
petitradius = 2.5,
margin = {
top: hauteur / 10,
right: largeur / 12,
bottom: hauteur / 3,
left: largeur / 12
},
tailleTriangle = largeur / 6;
/* en mobile */
if (largeur étape passée";
}
/* la titraille */
contenu = "
Étape " + i + " (" + String(etapes[i].type).replace("contre-la-montre", "CLM") + ")";
contenu += " – ";
if (largeur
"
if (largeur " + cartouche + etapes[i].nom.replace("–", " – ").replace("Contre-la-montre", "CLM").replace("????????", espagne);
contenu += "
: ";
} else {
contenu += "" + cartouche + etapes[i].nom.replace("–", " – ").replace("????????", espagne);
contenu += " : ";
}
contenu += String(etapes[i].distance).replace(".", ",") + " km";
if (etapes[i].deniv) {
contenu += ", " + milliers(etapes[i].deniv) + "m d'ascension" /*de D+*/ ;
}
contenu += "
";
/* on envoie tout */
d3.select("#etape" + i)
.attr("data-rangement", ((classeenrabe == " passe") ? i + 21 : i))
.html(contenu)
.classed(classeenrabe, true)
/* le svg */
var svg = d3.select("#etape" + i).append("svg")
.attr("width", "100%")
.attr("viewBox", function(d) {
if (plat.indexOf(i) != -1) {
return "0 " + hauteur / 2.4 + " " + (largeur + margin.left + margin.right) + " " + (hauteur * .6 + margin.top + margin.bottom)
} else {
return "0 0 " + (largeur + margin.left + margin.right) + " " + (hauteur + margin.top + margin.bottom)
}
});
var graphe = svg.append("g")
.attr("class", "graphe")
.attr("transform", "translate(" + margin.left + "," + (hauteur - (hauteurgraphe * 1.1)) + ")");
var barre = svg.append("g")
.attr("class", "groupebarre")
.attr("transform", "translate(" + margin.left + "," + hauteur + ")");
/* les données de la courbe */
var dataligne = [{
debut: etapes[i].depart,
fin: etapes[i].depart,
val: 1
}];
for (const [j, e] of data.entries()) {
if (e.etape == i) {
valeur = 1;
if (dico[e.quoi].taille) {
valeur = dico[e.quoi].taille;
}
/* bricolage pour la courbe, quand les durées sont supérieures à 40 minutes, soit 2400000 millisecondes */
if (tps(e.fin) - tps(e.debut) >= 2400000) {
tdeb = moment(e.debut, "HH:mm");
tfin = moment(e.fin, "HH:mm");
milieu = (tfin.diff(tdeb) / 60000) / 2;
nouveaumilieu = moment(e.debut, "HH:mm").add(milieu, "minutes");
/* on pousse */
dataligne.push({
debut: e.debut,
fin: nouveaumilieu.format("HH:mm"),
val: +valeur
});
dataligne.push({
debut: nouveaumilieu.format("HH:mm"),
fin: e.fin,
val: +valeur
});
} else {
dataligne.push({
debut: e.debut,
fin: e.fin,
val: +valeur
});
}
}
}
dataligne.push({
debut: etapes[i].arrivee,
fin: etapes[i].arrivee,
val: dataligne[dataligne.length - 1].val
})
/* la courbe */
var ligne = d3.line()
.curve(quelleCourbe)
.x(d => (x(tps(d.debut)) + x(tps(d.fin))) / 2)
.y(d => y(d.val));
var aire = d3.area()
.curve(quelleCourbe)
.x(d => (x(tps(d.debut)) + x(tps(d.fin))) / 2)
.y0(hauteurgraphe)
.y1(d => y(d.val));
graphe.append("path")
.data([dataligne])
.attr("class", "aire")
.attr("d", aire);
graphe.append("path")
.data([dataligne])
.attr("class", "ligne")
.attr("d", ligne);
/* les petits cercles du début et de la fin les textes */
graphe.selectAll("circle")
.data([etapes[i].depart, etapes[i].arrivee])
.enter()
.append("circle")
.attr("class", "petitpoint")
.attr("cx", function(d, j) {
if (j == 0) {
return x(tps(d)) + petitradius;
} else {
return x(tps(d)) - petitradius;
}
})
.attr("cy", function(d, j) {
alt = 1;
if (j == 1) {
if (corresArrivee[i]) {
alt = corresArrivee[i];
}
}
return y(alt);
})
.attr("r", petitradius);
graphe.selectAll("text")
.data([etapes[i].depart, etapes[i].arrivee])
.enter()
.append("text")
.attr("class", function(d, j) {
if (j == 0) {
return "texte depart passelect";
} else {
return "texte arrivee passelect";
}
})
.attr("x", function(d, j) {
if (j == 0) {
return x(tps(d)) - (petitradius * 2);
} else {
return x(tps(d)) + (petitradius * 2);
}
})
.attr("y", function(d, j) {
alt = 1;
if (j == 1) {
if (corresArrivee[i]) {
alt = corresArrivee[i];
}
}
return y(alt) + (petitradius * 1.5);
})
.text(d => aLaBonneHeure(d.substring(0, d.length - 1) + "0"));
var dataCotes = data.filter(d => +d.etape == i && cols.indexOf(d.quoi) != -1);
/* les cercles */
graphe.selectAll("circle.cote")
.data(dataCotes)
.enter()
.append("circle")
.attr("class", "cote")
.attr("cx", d => (x(tps(d.debut)) + x(tps(d.fin))) / 2)
.attr("cy", d => y(dico[d.quoi].taille))
.attr("r", radius)
.attr("data-tt", function(d) {
d.km = +d.km;
html = "" + d.nom;
if (d.rabe) {
html += "" + d.rabe + "";
}
html += "
";
html += "KM " + String((etapes[i].distance - d.km).toFixed(1)).replace(".", ",").replace(",0", "") + " – ascension " + dico[d.quoi].trad + "
";
html += "";
html += "Passage prévu entre " + d.debut.replace(":", " h ") + " et " + d.fin.replace(":", " h ") + "
";
html += "";
return html;
});
/* le texte des ascensions */
graphe.selectAll("text.textecote")
.data(dataCotes)
.enter()
.append("text")
.attr("class", "textecote passelect")
.attr("x", d => (x(tps(d.debut)) + x(tps(d.fin))) / 2)
.attr("y", d => +(y(dico[d.quoi].taille) - radius * 1.8))
.text(d => d.quoi.replace("cat", ""));
/* la texture */
var t = textures.lines()
.orientation("diagonal")
.size(6)
.strokeWidth(2)
.shapeRendering("crispEdges")
.background("rgba(222, 163, 11 ,.1)")
.stroke("rgb(222, 163, 11)");
svg.call(t);
d3.select("#hachure rect").style("fill", t.url())
/* la barre */
barre.selectAll(".barre")
.data(data)
.enter()
.filter(e => e.etape == i)
.append("rect")
.attr("class", function(d) {
classe = "barre"
if (d.quoi == "sieste") classe += " " + d.quoi
return classe
})
.attr("fill", d => ((d.quoi != "sieste") ? t.url() : ""))
.attr("x", d => x(tps(d.debut)))
.attr("width", d => x(tps(d.fin)) - x(tps(d.debut)) + 1)
.attr("y", d => 0)
.attr("height", d => hauteurbarre)
.attr("data-tt", function(d) {
if (d.quoi != "sieste") {
html = "" + d.nom;
if (d.rabe) {
html += "" + d.rabe + "";
}
html += "
";
html += "";
if (d.quoi != "suivre") {
html += "KM " + String((etapes[i].distance - d.km).toFixed(1)).replace(".", ",").replace(",0", "") + " – ";
}
if (d.quoi != "sprint" && d.quoi != "arrivée" && d.quoi != "20km" && d.quoi != "10km" && d.quoi != "pave" && d.quoi != "suivre") {
html += "ascension ";
}
html += dico[d.quoi].trad + "
";
html += "";
html += "Passage prévu entre " + d.debut.replace(":", " h ") + " et " + d.fin.replace(":", " h ") + "
";
return html;
}
});
/* on colle le triangle */
barre.selectAll(".triangle")
.data(data)
.enter()
.filter(e => e.etape == i && e.quoi == "sprint")
.append("path")
.attr("class", "triangle")
.attr("d", triangle)
.attr("transform", e => "translate(" + (x(tps(e.debut)) + x(tps(e.fin))) / 2 + "," + hauteurbarre + ")");
/* on filtre pour ne garder que les phases où il se passera des trucs */
var datatemp = [];
for (const [j, e] of data.entries()) {
if (e.etape == i && e.quoi !== "sieste") {
datatemp.push(e);
e.index = j;
}
}
var heuresTemp = [];
barre.selectAll("text")
.data(datatemp)
.enter()
.filter(function(e, j) {
if (j == 0) {
heuresTemp.push(e);
return e;
}
if (j > 0 && e.index - (datatemp[j - 1].index) > 1) {
heuresTemp.push(e);
return e;
}
})
.append("text")
.attr("class", "axe passelect")
.text((e, j) => ((mobile) ? e.debut : aLaBonneHeure(e.debut)))
.attr("transform", e => "translate(" + x(tps(e.debut)) + "," + hauteurbarre * 2.6 + ")");
// on gère l'agenda
if (classeenrabe == "") {
d3.select("#etape" + i)
.append("div")
.attr("class", "agendaclic")
.append("a")
.attr("class", "afficheragenda")
.attr("href", "#agenda" + i)
.html("Ajouter des rappels à mon calendrier " + doigt);
d3.select("#etape" + i)
.append("div")
.attr("class", "contenant_agenda")
.attr("id", "agenda" + i);
var agenda = element = document.querySelector("#etape" + i + " .contenant_agenda"),
dateTemp = etapes[i].date.split("/"),
dateEvenement = dateTemp[2] + "-" + dateTemp[1] + "-" + dateTemp[0];
for (const [j, e] of heuresTemp.entries()) {
cal = ``;
agenda.innerHTML += cal;
}
}
};
// les événements au clic pour les agendas
const show = (e) => {
const getHeight = () => {
e.style.display = 'block';
const height = e.scrollHeight + 'px';
e.style.display = '';
return height;
};
const height = getHeight(); //get natural height
e.classList.add('is-visible'); //make element visible
e.style.height = height; //update max-height
//once the transition is complete, remove inlinie max-height so the content can scale responsively
window.setTimeout(() => {
e.style.height = '';
}, 180);
};
// hide element
const hide = (e) => {
//give the element a height to change from
e.style.height = e.scrollHeight + 'px';
//set height back to 0
window.setTimeout(() => {
e.style.height = '0';
}, 1);
window.setTimeout(() => {
e.classList.remove('is-visible');
}, 180);
}
const toggle = (e) => {
if (e.classList.contains('is-visible')) {
hide(e);
return;
}
show(e);
};
//listen for click event
document.addEventListener('click', event => {
if (!event.target.classList.contains('afficheragenda')) return;
//Prevent default link behavior
event.preventDefault();
const content = document.querySelector(event.target.hash);
if (!content) return;
toggle(content);
}, false);
/* on range les divs si les étapes sont passées */
var liste_etapes = document.querySelectorAll('.siesteparetape');
[].slice.call(liste_etapes).sort((a, b) => a.getAttribute('data-rangement') - b.getAttribute('data-rangement'))
.forEach(function(ceci) {
ceci.parentNode.appendChild(ceci)
});
/* le tooltip*/
const isInApp = window.location.href.match(/apps.([a-z]+\-)?lemonde.fr/);
tooltip_brt("circle.cote", 2, 14)
tooltip_brt("rect.barre:not(.sieste)", 2, -5)