Site web bilingue (français / anglais) du Laboratoire d'innovation et de recherche en énergie intelligente (LIREI) de l'Université du Québec à Trois-Rivières, membre de l'Institut de recherche sur l'hydrogène (IRH).
Site statique construit avec Astro : le français est servi à la racine (/) et l'anglais sous /en/.
- Node.js ≥ 20 (Astro 5)
npm install # installer les dépendances
npm run dev # serveur de développement (http://localhost:4321)
npm run build # génère le site statique dans dist/
npm run preview # prévisualise le contenu de dist/Chaque git push sur main déclenche le workflow .github/workflows/deploy.yml qui construit et publie le site sur https://lirei-lab.github.io/.
Le site est entièrement statique : copiez le contenu de dist/ sur n'importe quel serveur web (Apache, Nginx, serveur de l'UQTR…). Aucun environnement d'exécution n'est requis.
Si le site est servi sous un sous-chemin (par ex. https://exemple.ca/lirei/), construisez avec :
BASE_PATH=/lirei npm run buildLe site intègre Sveltia CMS : une interface visuelle à l'adresse /admin/ pour modifier l'équipe, les publications, les projets et les actualités sans toucher au code.
Deux façons de se connecter, aucune ne nécessite de serveur OAuth :
À privilégier si vous éditez depuis un poste différent de celui où vit le dépôt (par ex. navigateur sur Windows, code sur un serveur Linux en SSH) : cette méthode parle directement à GitHub, sans fichiers locaux.
- Sur GitHub : Settings → Developer settings → Personal access tokens → Fine-grained tokens → Generate new token. Portée : dépôt
lirei-lab/lirei-lab.github.io, permission Contents : Read and write. Copier le jeton. - Ouvrir
/admin/— soit en production (https://lirei-lab.github.io/admin/, aucunnpmrequis), soit en local (npm run dev→http://localhost:4321/admin/). - Cliquer sur « Sign In Using Access Token » et coller le jeton.
- Éditer avec les formulaires : chaque sauvegarde crée un commit sur GitHub, ce qui redéploie le site automatiquement.
Fonctionne uniquement quand le navigateur et les fichiers du dépôt sont sur la même machine (l'API navigateur d'accès aux fichiers ne peut pas atteindre un dossier distant en SSH). Sur ce poste :
npm run dev- Ouvrir
http://localhost:4321/admin/(navigateur basé sur Chromium : Chrome, Edge). - Cliquer sur « Work with Local Repository » et sélectionner le dossier du projet.
- Éditer, puis
git commit+git push.
La configuration des collections vit dans public/admin/config.yml.
Le bouton « Sign In with GitHub » (flux OAuth classique) exige un petit relais qui garde le secret GitHub (impossible dans un site statique). Ce relais peut être hébergé n'importe où — un worker sveltia-cms-auth gratuit sur Cloudflare, une fonction serverless, ou le serveur de l'UQTR — puis renseigné via base_url dans config.yml. Inutile pour les méthodes A et B ci-dessus.
Tout le contenu structuré vit dans src/content/. Ajouter du contenu = ajouter un fichier ; le schéma est validé automatiquement au build.
Créez src/content/team/prenom-nom.json :
{
"name": "Prénom Nom",
"category": "student",
"role": { "fr": "Étudiant(e) aux cycles supérieurs", "en": "Graduate Student" },
"topic": { "fr": "Sujet de recherche", "en": "Research topic" },
"email": "prenom.nom@uqtr.ca",
"order": 60
}category : direction, professor, staff, postdoc ou student. order contrôle l'ordre d'affichage dans chaque groupe.
Le catalogue se met à jour à partir de Crossref (la notice de l'éditeur : titre, auteurs, revue, DOI) et d'OpenAlex (qui retrouve des articles que la recherche par nom de Crossref classe trop bas) :
python3 scripts/update-publications.py # rapport : ce qui manque, rien n'est écrit
python3 scripts/update-publications.py --write # ajoute les fiches et régénère la carte des sujets
python3 scripts/update-publications.py --scholar # recoupe aussi avec le profil Google Scholar
python3 scripts/update-publications.py --since 2019 # remonte plus loin (défaut : l'année précédente)Le script ne modifie jamais une fiche existante : une publication déjà présente (même DOI ou même titre) est ignorée, donc les corrections faites à la main sont conservées. Les prépublications (SSRN, Preprints.org) sont écartées ; la version publiée les remplace. D'autres chercheurs s'appellent Agbossou : une publication n'est retenue que si Crossref indique l'ORCID ou le prénom « Kodjo », ou l'initiale « K. » avec un coauteur connu de l'équipe ou des diplômés.
Automatiquement, le 1er de chaque mois, le workflow .github/workflows/publications.yml
lance le script et, s'il trouve du nouveau, ouvre une pull request « Nouvelles
publications à valider » avec la liste et les liens DOI. Relisez-la (type, année,
auteurs), corrigez au besoin dans la branche, puis fusionnez : le site se
redéploie. On peut aussi le déclencher à la main dans l'onglet Actions. Pour
que GitHub Actions ait le droit d'ouvrir la PR, activez une fois Settings →
Actions → General → Allow GitHub Actions to create and approve pull requests.
Google Scholar n'a pas d'API et bloque les serveurs : --scholar est donc à
lancer depuis un poste. Ce qui figure sur Scholar sans DOI retrouvable (brevets,
thèses) est seulement listé ; si Google affiche un captcha, enregistrez la page du
profil depuis le navigateur et passez-la avec --scholar-file page.html.
Pour une publication sans DOI, créez src/content/publications/2026-titre-court.json :
{
"title": "Titre de l'article",
"authors": ["N. Henao", "K. Agbossou"],
"venue": "IEEE Transactions on Smart Grid",
"year": 2026,
"type": "journal",
"doi": "10.1109/XXX.2026.XXXXXXX"
}type : journal, conference ou other. doi et venue sont optionnels.
Critère d'inclusion : le catalogue ne recense que les publications dont le professeur Kodjo Agbossou est coauteur (au moins un auteur nommé « Agbossou »).
La carte interactive en haut de la page Publications est calculée hors ligne, à partir des titres. Après avoir ajouté ou retiré des publications :
python3 scripts/build-topics.py # régénère src/data/topics.json
python3 scripts/build-topics.py --audit # contrôle : couverture et sujets orphelinsLe vocabulaire des sujets (leurs noms français et anglais, et les motifs qui les
reconnaissent dans un titre) est en tête de scripts/build-topics.py. L'audit
signale les publications qu'aucun sujet ne couvre : c'est le bon moment pour
élargir un motif ou ajouter un sujet. Le calcul est déterministe — mêmes
publications, même carte.
Créez src/content/projects/mon-projet.md :
---
title:
fr: "Titre du projet"
en: "Project title"
summary:
fr: "Résumé en une ou deux phrases."
en: "One- or two-sentence summary."
axis: smartgrids
status: active
partners: ["Hydro-Québec"]
---axis : smartgrids, residential, ml, hydrogen, flexibility ou ev. status : active ou completed.
Tous les textes d'interface et de contenu éditorial sont dans src/i18n/fr.json et src/i18n/en.json. Modifiez les deux fichiers pour garder les langues synchronisées.
src/
├── i18n/ # dictionnaires FR/EN + aide de routage
├── layouts/ # gabarit de base (en-tête, pied de page, SEO)
├── components/ # composants réutilisables et pages partagées
├── content/ # équipe, publications, projets (collections typées)
├── pages/ # routes FR à la racine, routes EN sous en/
└── styles/ # feuille de style globale