Signaler les envies déjà entrées au catalogue, sans les supprimer

La demande initiale était de retirer l'envie ; c'est refusé. Le catalogue
est commun et la liste d'envies personnelle : supprimer modifierait la
liste d'un autre en silence, avec sa note. Et le rapprochement par clé
d'œuvre est faillible, alors qu'une suppression ne se rattrape pas.

L'étiquette « Déjà au catalogue » mène à la fiche, pour vérifier avant de
retirer. Le critère est celui des doublons, la convention d'auteur commun
étant désormais partagée par les deux (RapprochementAuteurs).

Au passage : accolade manquante sur .etiquette-souhaite, qui avalait la
règle suivante — le bandeau de mise à jour perdait son style.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mathieu
2026-08-19 21:30:55 +02:00
co-authored by Claude Opus 5
parent 383ed43227
commit a49125ddc3
9 changed files with 301 additions and 42 deletions
@@ -90,6 +90,33 @@ public static class RapprochementAuteurs
public static bool SontLeMemeAuteur(string? a, string? b) =>
Comparer(a, b) == NiveauRapprochement.Certain;
/// <summary>
/// Deux jeux de noms ont-ils au moins un auteur en commun ?
/// </summary>
/// <remarks>
/// Sert partout où l'on rapproche deux fiches par leur titre : le titre seul ne suffit
/// jamais — deux recueils « Nouvelles » sans rapport se confondraient — mais un auteur
/// commun tranche.
/// <para>
/// <b>Convention</b> : deux jeux <b>tous deux vides</b> concordent. Le titre est alors la
/// seule information disponible des deux côtés, et exiger un auteur reviendrait à ne jamais
/// rien rapprocher. Un jeu vide face à un jeu renseigné, en revanche, ne concorde pas :
/// l'information manque d'un seul côté, ce qui n'est pas une raison de conclure.
/// </para>
/// </remarks>
public static bool PartagentUnAuteur(IEnumerable<string?> a, IEnumerable<string?> b)
{
var gauche = a.Where(n => !string.IsNullOrWhiteSpace(n)).ToList();
var droite = b.Where(n => !string.IsNullOrWhiteSpace(n)).ToList();
if (gauche.Count == 0 && droite.Count == 0)
{
return true;
}
return gauche.Any(g => droite.Any(d => SontLeMemeAuteur(g, d)));
}
/// <summary>
/// Cherche à placer chaque mot de <paramref name="aPlacer"/> sur un mot distinct de
/// <paramref name="cible"/>, par égalité ou par initiale.