63 lines
3 KiB
JavaScript
63 lines
3 KiB
JavaScript
|
|
// © 2026 TechnoLibre (http://www.technolibre.ca)
|
||
|
|
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
|
||
|
|
|
||
|
|
// Les textes des codes de src/csv (§ 10.1, § 14.6) : encodage, séparateur,
|
||
|
|
// en-tête, refus d'une ligne, refus de la mise à jour.
|
||
|
|
import { cite, enumeration } from './aides.js';
|
||
|
|
|
||
|
|
// Le remède commun aux refus d'encodage (§ 10.1).
|
||
|
|
const REMEDE_UTF8 = 'Réenregistrez le fichier en UTF-8 depuis le tableur, puis importez-le de nouveau.';
|
||
|
|
const refusEncodage = (constat) => () => `${constat} ${REMEDE_UTF8}`;
|
||
|
|
|
||
|
|
export const TABLE = new Map([
|
||
|
|
// --- Le CSV (§ 10.1) -------------------------------------------------------
|
||
|
|
['UTF16_SANS_MARQUE', refusEncodage("Le fichier semble encodé en UTF-16, sans la marque qui l'annonce.")],
|
||
|
|
['UTF16_INVALIDE', refusEncodage("Le fichier s'annonce en UTF-16, mais ses octets ne le sont pas.")],
|
||
|
|
['UTF8_INVALIDE', refusEncodage("Le fichier s'annonce en UTF-8, mais ses octets ne le sont pas.")],
|
||
|
|
['CARACTERE_NUL', refusEncodage("Le texte porte un caractère nul, qu'aucune liste ne contient.")],
|
||
|
|
['ENREGISTRER_EN_UTF8', () => REMEDE_UTF8],
|
||
|
|
[
|
||
|
|
'SEPARATEUR_INTROUVABLE',
|
||
|
|
({ ligne, cause }, texte) => {
|
||
|
|
const constat = 'Aucun séparateur ne convient : ni le point-virgule, ni la virgule, ni la tabulation.';
|
||
|
|
if (ligne === null || ligne === undefined) return constat;
|
||
|
|
const ecart = texte(cause === 'GUILLEMET_OUVERT' ? 'GUILLEMET_OUVERT' : 'NOMBRE_DE_CHAMPS', { ligne });
|
||
|
|
return `${constat} ${ecart}`;
|
||
|
|
},
|
||
|
|
],
|
||
|
|
['NOMBRE_DE_CHAMPS', ({ ligne }) => `Avec chacun, la ligne ${ligne} n'a pas le nombre de champs de l'en-tête.`],
|
||
|
|
[
|
||
|
|
'GUILLEMET_OUVERT',
|
||
|
|
({ ligne }) =>
|
||
|
|
`Un guillemet ouvert${Number.isInteger(ligne) ? ` à la ligne ${ligne}` : ''} ne se referme pas : ` +
|
||
|
|
'tout ce qui le suit tiendrait dans un seul champ.',
|
||
|
|
],
|
||
|
|
['AUCUN_ENTETE', () => "Aucun en-tête n'est reconnu : la première ligne nomme les colonnes, « nom » au moins."],
|
||
|
|
['NOM_NON_ASSOCIE', () => "Aucune colonne ne porte le nom : l'en-tête doit compter une colonne « nom »."],
|
||
|
|
['AUCUNE_LIGNE_VALIDE', () => "Aucune ligne n'est valide : rien n'est importé."],
|
||
|
|
['CHAMPS_EN_TROP', () => "La ligne compte plus de champs que l'en-tête."],
|
||
|
|
['NOM_ABSENT', () => 'Le nom manque.'],
|
||
|
|
[
|
||
|
|
'EXCLU_INCONNU',
|
||
|
|
({ valeur }) =>
|
||
|
|
`La valeur d'« exclu » ${cite(valeur)} n'est pas reconnue : ` +
|
||
|
|
'oui, o, vrai, 1 ou x pour exclure ; non, n, faux, 0 ou vide sinon.',
|
||
|
|
],
|
||
|
|
[
|
||
|
|
'PLUSIEURS_CORRESPONDENT',
|
||
|
|
({ participants }) =>
|
||
|
|
'Plusieurs personnes de la liste correspondent à cette ligne ' +
|
||
|
|
`(${enumeration(participants.map((id) => `n° ${id}`))}) : rien n'est fusionné.`,
|
||
|
|
],
|
||
|
|
[
|
||
|
|
'DEJA_DESIGNE',
|
||
|
|
({ premiereLigne }) => `La ligne ${premiereLigne} désigne déjà cette personne : rien n'est fusionné.`,
|
||
|
|
],
|
||
|
|
['PLAN_BLOQUE', () => 'Le plan est bloqué : « Débloquer » le rend de nouveau modifiable.'],
|
||
|
|
[
|
||
|
|
'AMBIGUITE',
|
||
|
|
({ champs }) =>
|
||
|
|
`Plusieurs colonnes répondent au même champ (${enumeration(champs)}) : choisissez celle qui s'importe.`,
|
||
|
|
],
|
||
|
|
]);
|