Skip to content

Commit eb30b4a

Browse files
Update comparison
1 parent 05baf05 commit eb30b4a

9 files changed

Lines changed: 344 additions & 58 deletions

File tree

bundle.js

Lines changed: 167 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/i18n/locales/en.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,15 @@
252252
"comparison.artistCount": "{count} artist(s)",
253253
"comparison.noSharedArtist": "No shared artist",
254254
"comparison.removeAria": "Remove {label}",
255+
"comparison.kind.artists": "artists",
256+
"comparison.kind.artworks": "artworks",
257+
"comparison.kind.items": "items",
258+
"comparison.generic.commonArtists": "{count} shared {kind}",
259+
"comparison.generic.noCommonArtists": "No shared {kind}",
260+
"comparison.generic.columnMeta": "{total} {kind} • {unique} unique",
261+
"comparison.generic.noUniqueArtist": "No unique item",
262+
"comparison.generic.artistCount": "{count} {kind}",
263+
"comparison.generic.noSharedArtist": "No shared item",
255264
"explorer.theme.artworksFound": "{count} artworks found for this theme.",
256265
"explorer.theme.loadingArtworks": "Loading artworks for this theme...",
257266
"explorer.action.openConstellation": "Explore in constellation",

src/i18n/locales/es.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,15 @@
252252
"comparison.artistCount": "{count} artista(s)",
253253
"comparison.noSharedArtist": "Ningun artista compartido",
254254
"comparison.removeAria": "Retirar {label}",
255+
"comparison.kind.artists": "artistas",
256+
"comparison.kind.artworks": "obras",
257+
"comparison.kind.items": "elementos",
258+
"comparison.generic.commonArtists": "{count} {kind} en comun",
259+
"comparison.generic.noCommonArtists": "Ningun elemento en comun",
260+
"comparison.generic.columnMeta": "{total} {kind} • {unique} unicos",
261+
"comparison.generic.noUniqueArtist": "Ningun elemento unico",
262+
"comparison.generic.artistCount": "{count} {kind}",
263+
"comparison.generic.noSharedArtist": "Ningun elemento compartido",
255264
"explorer.theme.artworksFound": "{count} obras encontradas para este tema.",
256265
"explorer.theme.loadingArtworks": "Cargando obras para este tema...",
257266
"explorer.action.openConstellation": "Explorar en la constelacion",

src/i18n/locales/fr.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,15 @@
252252
"comparison.artistCount": "{count} artiste(s)",
253253
"comparison.noSharedArtist": "Aucun artiste partagé",
254254
"comparison.removeAria": "Retirer {label}",
255+
"comparison.kind.artists": "artistes",
256+
"comparison.kind.artworks": "œuvres",
257+
"comparison.kind.items": "éléments",
258+
"comparison.generic.commonArtists": "{count} {kind} en commun",
259+
"comparison.generic.noCommonArtists": "Aucun élément en commun",
260+
"comparison.generic.columnMeta": "{total} {kind} • {unique} uniques",
261+
"comparison.generic.noUniqueArtist": "Aucun élément unique",
262+
"comparison.generic.artistCount": "{count} {kind}",
263+
"comparison.generic.noSharedArtist": "Aucun élément partagé",
255264
"explorer.theme.artworksFound": "{count} œuvres trouvées pour ce thème.",
256265
"explorer.theme.loadingArtworks": "Chargement des œuvres pour ce thème...",
257266
"explorer.action.openConstellation": "Explorer dans la constellation",

src/semantique/graphe.multi

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,15 +135,20 @@ classe Graphe:
135135

136136
tantque len(queue) > 0:
137137
chemin = queue.pop(0)
138-
noeud_actuel = chemin[-1]
138+
noeud_actuel = chemin[len(chemin) - 1]
139139

140140
pour voisin_id dans self.obtenir_voisins(noeud_actuel):
141+
nouveau_chemin = []
142+
pour etape_id dans chemin:
143+
nouveau_chemin.ajouter(etape_id)
144+
nouveau_chemin.ajouter(voisin_id)
145+
141146
si voisin_id == noeud_arrivee_id:
142-
retour chemin + [voisin_id]
147+
retour nouveau_chemin
143148

144149
si voisin_id non dans visites:
145150
visites.ajouter(voisin_id)
146-
queue.ajouter(chemin + [voisin_id])
151+
queue.ajouter(nouveau_chemin)
147152

148153
retour []
149154

src/semantique/intersections.multi

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,22 @@
11
importer ui.etat
22

33

4+
déf _obtenir_ids_elements(donnees: dictionnaire) -> liste:
5+
"""Retourner les IDs comparables, avec compatibilité pour l'ancien format artistes."""
6+
items = donnees.obtenir("items_ids", nul)
7+
si items est nul:
8+
items = donnees.obtenir("artistes_ids", [])
9+
retour items
10+
11+
12+
déf _obtenir_labels_elements(donnees: dictionnaire) -> dictionnaire:
13+
"""Retourner les labels comparables, avec compatibilité pour l'ancien format artistes."""
14+
labels = donnees.obtenir("items_labels", nul)
15+
si labels est nul:
16+
labels = donnees.obtenir("artistes_labels", {})
17+
retour labels
18+
19+
420
déf calculer_intersection_artistes(ids_entites: liste) -> liste:
521
"""Calculer les artistes communs à toutes les entités données"""
622
si len(ids_entites) < 2:
@@ -10,12 +26,12 @@ déf calculer_intersection_artistes(ids_entites: liste) -> liste:
1026
premiere_entite = ids_entites[0]
1127
donnees0 = ui.etat.obtenir_donnees_comparaison().obtenir(premiere_entite, {})
1228
communs = {}
13-
pour artiste_id dans donnees0.obtenir("artistes_ids", []):
29+
pour artiste_id dans _obtenir_ids_elements(donnees0):
1430
communs[artiste_id] = vrai
1531

1632
pour entite_id dans ids_entites[1:]:
1733
donnees = ui.etat.obtenir_donnees_comparaison().obtenir(entite_id, {})
18-
ids_entite = donnees.obtenir("artistes_ids", [])
34+
ids_entite = _obtenir_ids_elements(donnees)
1935
dict_entite = {}
2036
pour a dans ids_entite:
2137
dict_entite[a] = vrai
@@ -41,7 +57,7 @@ déf calculer_artistes_uniques(ids_entites: liste) -> dictionnaire:
4157
pour entite_id dans ids_entites:
4258
donnees = ui.etat.obtenir_donnees_comparaison().obtenir(entite_id, {})
4359
d = {}
44-
pour a dans donnees.obtenir("artistes_ids", []):
60+
pour a dans _obtenir_ids_elements(donnees):
4561
d[a] = vrai
4662
ensembles[entite_id] = d
4763

@@ -65,7 +81,7 @@ déf obtenir_etiquette_artiste(artiste_id: chaine, ids_entites: liste) -> chaine
6581
"""Chercher l'étiquette d'un artiste dans les données de comparaison chargées"""
6682
pour entite_id dans ids_entites:
6783
donnees = ui.etat.obtenir_donnees_comparaison().obtenir(entite_id, {})
68-
labels = donnees.obtenir("artistes_labels", {})
84+
labels = _obtenir_labels_elements(donnees)
6985
label = labels.obtenir(artiste_id, "")
7086
si label:
7187
retour label
@@ -84,7 +100,7 @@ déf obtenir_statistiques(ids_entites: liste) -> dictionnaire:
84100
total_par_entite = {}
85101
pour entite_id dans ids_entites:
86102
donnees = ui.etat.obtenir_donnees_comparaison().obtenir(entite_id, {})
87-
total_par_entite[entite_id] = len(donnees.obtenir("artistes_ids", []))
103+
total_par_entite[entite_id] = len(_obtenir_ids_elements(donnees))
88104

89105
uniques_par_entite = {}
90106
pour eid, u dans artistes_uniques.items():

src/semantique/temporel.multi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ classe AnalyseArtiste:
211211
retour 0
212212

213213
oeuvres_triees = sorted(self.oeuvres)
214-
retour oeuvres_triees[-1] - oeuvres_triees[0]
214+
retour oeuvres_triees[len(oeuvres_triees) - 1] - oeuvres_triees[0]
215215

216216
déf obtenir_productivite_moyenne() -> nombre:
217217
"""Calculer les œuvres par année"""

src/ui/composants/panneau_comparaison.multi

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,29 @@ déf _ti(cle: chaine, params: dictionnaire) -> chaine:
1414
retour texte
1515

1616

17+
déf _obtenir_kind_comparaison(ids_entites: liste) -> chaine:
18+
pour entite_id dans ids_entites:
19+
donnees = ui.etat.obtenir_donnees_comparaison().obtenir(entite_id, {})
20+
kind = donnees.obtenir("items_kind", "")
21+
si kind:
22+
retour kind
23+
retour "artists"
24+
25+
26+
déf _cle_comparaison(kind: chaine, suffixe: chaine) -> chaine:
27+
si kind == "artists":
28+
retour "comparison." + suffixe
29+
retour "comparison.generic." + suffixe
30+
31+
32+
déf _libelle_kind(kind: chaine) -> chaine:
33+
si kind == "artworks":
34+
retour _t("comparison.kind.artworks")
35+
si kind == "artists":
36+
retour _t("comparison.kind.artists")
37+
retour _t("comparison.kind.items")
38+
39+
1740
déf rendre_panneau_comparaison() -> chaine:
1841
"""Rendre le panneau de comparaison entre entités sélectionnées"""
1942
entites = ui.etat.obtenir_entites_comparaison()
@@ -45,6 +68,8 @@ déf rendre_panneau_comparaison() -> chaine:
4568
pour entite dans entites:
4669
ids_entites.ajouter(entite.obtenir("id", ""))
4770

71+
kind = _obtenir_kind_comparaison(ids_entites)
72+
kind_label = _libelle_kind(kind)
4873
artistes_communs = semantique.intersections.calculer_intersection_artistes(ids_entites)
4974
artistes_uniques = semantique.intersections.calculer_artistes_uniques(ids_entites)
5075
stats = semantique.intersections.obtenir_statistiques(ids_entites)
@@ -53,7 +78,7 @@ déf rendre_panneau_comparaison() -> chaine:
5378
toutes_chargees = vrai
5479
pour entite_id dans ids_entites:
5580
donnees = ui.etat.obtenir_donnees_comparaison().obtenir(entite_id, {})
56-
si donnees.obtenir("artistes_ids", nul) est nul:
81+
si donnees.obtenir("items_ids", donnees.obtenir("artistes_ids", nul)) est nul:
5782
toutes_chargees = faux
5883

5984
si non toutes_chargees:
@@ -67,9 +92,9 @@ déf rendre_panneau_comparaison() -> chaine:
6792
nb_communs = stats.obtenir("artistes_communs_count", 0)
6893
html = html + '<div class="comparaison-resume">'
6994
si nb_communs > 0:
70-
html = html + '<p class="comparaison-resume-texte">' + _ti("comparison.commonArtists", {"count": '<strong>' + chaine(nb_communs) + '</strong>'}) + '</p>'
95+
html = html + '<p class="comparaison-resume-texte">' + _ti(_cle_comparaison(kind, "commonArtists"), {"count": '<strong>' + chaine(nb_communs) + '</strong>', "kind": kind_label}) + '</p>'
7196
sinon:
72-
html = html + '<p class="comparaison-resume-texte">' + _t("comparison.noCommonArtists") + '</p>'
97+
html = html + '<p class="comparaison-resume-texte">' + _ti(_cle_comparaison(kind, "noCommonArtists"), {"kind": kind_label}) + '</p>'
7398
html = html + '</div>'
7499

75100
# Grille: colonnes entités + colonne centrale commune
@@ -84,7 +109,7 @@ déf rendre_panneau_comparaison() -> chaine:
84109

85110
html = html + '<div class="comparaison-colonne">'
86111
html = html + '<h4 class="comparaison-col-titre">' + entite_label + '</h4>'
87-
html = html + '<span class="comparaison-col-meta">' + _ti("comparison.columnMeta", {"total": total, "unique": len(uniques)}) + '</span>'
112+
html = html + '<span class="comparaison-col-meta">' + _ti(_cle_comparaison(kind, "columnMeta"), {"total": total, "unique": len(uniques), "kind": kind_label}) + '</span>'
88113

89114
si uniques:
90115
html = html + '<ul class="comparaison-liste">'
@@ -95,14 +120,14 @@ déf rendre_panneau_comparaison() -> chaine:
95120
html = html + '<li class="comparaison-item comparaison-plus">+ ' + _ti("comparison.moreOthers", {"count": len(uniques) - 8}) + '</li>'
96121
html = html + '</ul>'
97122
sinon:
98-
html = html + '<p class="comparaison-vide">' + _t("comparison.noUniqueArtist") + '</p>'
123+
html = html + '<p class="comparaison-vide">' + _ti(_cle_comparaison(kind, "noUniqueArtist"), {"kind": kind_label}) + '</p>'
99124

100125
html = html + '</div>'
101126

102127
# Colonne centrale — artistes communs
103128
html = html + '<div class="comparaison-colonne comparaison-colonne-commun">'
104129
html = html + '<h4 class="comparaison-col-titre comparaison-col-titre-commun">' + _t("comparison.commonColumn") + '</h4>'
105-
html = html + '<span class="comparaison-col-meta">' + _ti("comparison.artistCount", {"count": nb_communs}) + '</span>'
130+
html = html + '<span class="comparaison-col-meta">' + _ti(_cle_comparaison(kind, "artistCount"), {"count": nb_communs, "kind": kind_label}) + '</span>'
106131

107132
si artistes_communs:
108133
html = html + '<ul class="comparaison-liste">'
@@ -111,7 +136,7 @@ déf rendre_panneau_comparaison() -> chaine:
111136
html = html + '<li class="comparaison-item comparaison-commun">' + nom + '</li>'
112137
html = html + '</ul>'
113138
sinon:
114-
html = html + '<p class="comparaison-vide">' + _t("comparison.noSharedArtist") + '</p>'
139+
html = html + '<p class="comparaison-vide">' + _ti(_cle_comparaison(kind, "noSharedArtist"), {"kind": kind_label}) + '</p>'
115140

116141
html = html + '</div>'
117142
html = html + '</div>'

src/ui/etat.multi

Lines changed: 88 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ observer var pan_constellation_y = 0
4545
# Etat du mode recit et de la comparaison
4646
observer var mode_recit = faux
4747
observer var entites_comparaison = [] # [{id, type, label}, ...]
48-
observer var donnees_comparaison = {} # id -> {label, artistes_ids, artistes_labels}
48+
observer var donnees_comparaison = {} # id -> {label, items_ids, items_labels, items_kind, artistes_ids, artistes_labels}
4949

5050
# Etat de la trajectoire d'influence
5151
observer var trajectoire_depart_id = ""
@@ -609,6 +609,40 @@ déf obtenir_artistes_mouvement(mouvement_id: chaine) -> liste:
609609
retour ids
610610

611611

612+
déf _id_depuis_champ_entite(champ: dictionnaire) -> chaine:
613+
"""Extraire un Q-id depuis un champ normalisé {value: uri}."""
614+
retour _extraire_id_entite(champ)
615+
616+
617+
déf _enregistrer_donnees_comparaison(entite_id: chaine, etiquette: chaine, ids: liste, labels: dictionnaire, kind: chaine):
618+
"""Stocker une collection comparable pour une entité."""
619+
donnees_courantes = donnees_comparaison.obtenir(entite_id, {})
620+
donnees_courantes["label"] = etiquette ou donnees_courantes.obtenir("label", entite_id)
621+
donnees_courantes["items_ids"] = ids
622+
donnees_courantes["items_labels"] = labels
623+
donnees_courantes["items_kind"] = kind
624+
625+
# Compatibilité avec l'ancien panneau orienté mouvements/artistes.
626+
si kind == "artists":
627+
donnees_courantes["artistes_ids"] = ids
628+
donnees_courantes["artistes_labels"] = labels
629+
630+
donnees_comparaison[entite_id] = donnees_courantes
631+
632+
633+
déf _extraire_oeuvres_comparaison(oeuvres: liste) -> dictionnaire:
634+
ids = []
635+
labels = {}
636+
pour oeuvre dans oeuvres:
637+
oeuvre_id = _id_depuis_champ_entite(oeuvre.obtenir("artwork", {}))
638+
label_oeuvre = _etiquette_entite(oeuvre, ["artworkLabel"], "")
639+
si oeuvre_id:
640+
ids.ajouter(oeuvre_id)
641+
si label_oeuvre:
642+
labels[oeuvre_id] = label_oeuvre
643+
retour {"ids": ids, "labels": labels}
644+
645+
612646
déf basculer_comparaison(entite_id: chaine, type_entite: chaine, etiquette: chaine) -> booleen:
613647
"""Ajouter ou retirer une entité du panneau de comparaison. Retourne vrai si ajoutée."""
614648
pour entite dans entites_comparaison:
@@ -639,18 +673,14 @@ déf basculer_comparaison(entite_id: chaine, type_entite: chaine, etiquette: cha
639673
si noeud:
640674
artistes_labels[artiste_id] = noeud.etiquette
641675

642-
donnees_comparaison[entite_id] = {
643-
"label": etiquette,
644-
"artistes_ids": artistes_ids,
645-
"artistes_labels": artistes_labels
646-
}
676+
_enregistrer_donnees_comparaison(entite_id, etiquette, artistes_ids, artistes_labels, "artists")
647677
retour vrai
648678

649679

650680
asynchrone déf charger_donnees_comparaison(entite_id: chaine, type_entite: chaine):
651681
"""Charger les données d'une entité pour la comparaison sans modifier le graphe principal"""
652682
existantes = donnees_comparaison.obtenir(entite_id, {})
653-
si existantes.obtenir("artistes_ids", []):
683+
si existantes.obtenir("items_ids", []):
654684
retour
655685

656686
si type_entite == "mouvement":
@@ -668,10 +698,28 @@ asynchrone déf charger_donnees_comparaison(entite_id: chaine, type_entite: chai
668698
ids.ajouter(artiste_id)
669699
si label_art:
670700
labels[artiste_id] = label_art
671-
donnees_courantes = donnees_comparaison.obtenir(entite_id, {})
672-
donnees_courantes["artistes_ids"] = ids
673-
donnees_courantes["artistes_labels"] = labels
674-
donnees_comparaison[entite_id] = donnees_courantes
701+
_enregistrer_donnees_comparaison(entite_id, existantes.obtenir("label", entite_id), ids, labels, "artists")
702+
sauf erreur:
703+
passe
704+
sinon si type_entite == "artiste":
705+
essayer:
706+
oeuvres = attendre donnees.requetes.obtenir_oeuvres_artiste(entite_id, 50, mode_langue_actif)
707+
extraites = _extraire_oeuvres_comparaison(oeuvres)
708+
_enregistrer_donnees_comparaison(entite_id, existantes.obtenir("label", entite_id), extraites.obtenir("ids", []), extraites.obtenir("labels", {}), "artworks")
709+
sauf erreur:
710+
passe
711+
sinon si type_entite == "musee":
712+
essayer:
713+
oeuvres = attendre donnees.requetes.obtenir_oeuvres_musee(entite_id, 50, mode_langue_actif)
714+
extraites = _extraire_oeuvres_comparaison(oeuvres)
715+
_enregistrer_donnees_comparaison(entite_id, existantes.obtenir("label", entite_id), extraites.obtenir("ids", []), extraites.obtenir("labels", {}), "artworks")
716+
sauf erreur:
717+
passe
718+
sinon si type_entite == "sujet":
719+
essayer:
720+
oeuvres = attendre donnees.requetes.obtenir_oeuvres_par_sujet(entite_id, 50, mode_langue_actif)
721+
extraites = _extraire_oeuvres_comparaison(oeuvres)
722+
_enregistrer_donnees_comparaison(entite_id, existantes.obtenir("label", entite_id), extraites.obtenir("ids", []), extraites.obtenir("labels", {}), "artworks")
675723
sauf erreur:
676724
passe
677725

@@ -713,10 +761,35 @@ asynchrone déf trouver_trajectoire_influence(depart_id: chaine, arrivee_id: cha
713761
affichage_chargement = vrai
714762

715763
essayer:
716-
attendre construire_graphe_influences(depart_id)
717-
attendre construire_graphe_influences(arrivee_id)
718-
719-
chemin = graphe.chemin_plus_court(depart_id, arrivee_id)
764+
chemin = []
765+
visites = {depart_id}
766+
queue = [[depart_id]]
767+
profondeur_max = 4
768+
769+
# Le graphe courant est incomplet: enrichir les voisins d'influence à mesure du BFS.
770+
tantque len(queue) > 0 et non chemin:
771+
chemin_courant = queue.pop(0)
772+
noeud_courant = chemin_courant[len(chemin_courant) - 1]
773+
774+
si len(chemin_courant) - 1 < profondeur_max:
775+
attendre construire_graphe_influences(noeud_courant)
776+
voisins = graphe.obtenir_voisins(noeud_courant, "a_influence")
777+
778+
pour voisin_id dans voisins:
779+
si non chemin:
780+
nouveau_chemin = []
781+
pour etape_id dans chemin_courant:
782+
nouveau_chemin.ajouter(etape_id)
783+
nouveau_chemin.ajouter(voisin_id)
784+
785+
si voisin_id == arrivee_id:
786+
chemin = nouveau_chemin
787+
sinon si voisin_id non dans visites:
788+
visites.ajouter(voisin_id)
789+
queue.ajouter(nouveau_chemin)
790+
791+
si non chemin:
792+
chemin = graphe.chemin_plus_court(depart_id, arrivee_id)
720793

721794
labels = {}
722795
pour noeud_id dans chemin:

0 commit comments

Comments
 (0)