diff --git a/README.md b/README.md index 9303845a..7fd05f6f 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ La page montre les notes internes et les faits non relus. Elle reste locale : `r - **Fichiers** : JSON lisible, aucune clé en double, un schéma respecté, un nom de fichier égal à l’identifiant, un préfixe cohérent avec le dossier, des identifiants uniques dans tout le dépôt. - **Références** : chaque identifiant cité existe. - **Langues** : filiation sans cycle, codes uniques. -- **Unités** : exactement une forme canonique, dans l’écriture par défaut de la langue ; formes sans trait d’union ; `cle_normalisee` en NFC ; translittération dans une convention de la bonne écriture ; homographes distingués par la glose **et** par l’étymon. **Attestation** (ADR 0056) : seul un mot français porte une première attestation (`attestation.mot_francais`), jamais dans le futur (`attestation.future`), un intervalle finit après son début (`attestation.intervalle`) ; `annee_fin` n’existe que pour un intervalle (schéma). +- **Unités** : exactement une forme canonique, dans l’écriture par défaut de la langue ; formes sans trait d’union ; `cle_normalisee` en NFC ; translittération dans une convention de la bonne écriture ; homographes distingués par la glose **et** par l’étymon. **Attestation** (ADR 0056) : seul un mot français porte une première attestation (`attestation.mot_francais`), jamais dans le futur (`attestation.future`), un intervalle finit après son début (`attestation.intervalle`) ; `annee_fin` n’existe que pour un intervalle (schéma). **Exemples** : un sens peut porter, par locale, de 1 à 5 `exemples` distincts et non vides pour aider à se représenter un mot peu imaginable (schéma) ; ils sont rédigés, jamais copiés, et publiés avec la carte au dos de la carte. - **Compositions** : le résultat est un mot ; les parties sont au moins deux, de rangs continus, et leurs formes et sens appartiennent à leur unité ; pas de préfixe en dernier ni de suffixe en premier ; segments dans les bornes, sans chevauchement, et qui pavent le mot de la première à la dernière lettre : chaque partie en porte un (`composition.segments_manquants`, `composition.pavage`), ce sont eux qui donnent ses coupes au ricochet « Découper » (ADR 0044) ; une seule analyse préférée ; aucun cycle ; transformations au vocabulaire contrôlé. - **Relations** : source et cible différentes, sans doublon ni cycle ; un emprunt relie deux langues ; un héritage suit la filiation. - **Briques** : une par unité, qui affiche la forme canonique et un sens glosé de son unité. diff --git a/outils/src/tests/compilation.rs b/outils/src/tests/compilation.rs index b0cc6b32..60adeb85 100644 --- a/outils/src/tests/compilation.rs +++ b/outils/src/tests/compilation.rs @@ -245,6 +245,29 @@ fn attestation_publiee_sur_la_carte() { assert!(carte(&depot).get("attestation").is_none()); } +#[test] +fn exemples_publies_sur_la_carte() { + let depot = Depot::new(); + depot.modifier(depot.unite("géologie"), |u| { + u["sens"][0]["libelles"]["fr"]["exemples"] = + json!(["Une falaise dont les couches de roche sont visibles."]); + }); + let uid = depot.uid("géologie"); + let sortie = TempDir::new().unwrap(); + let parutions = compiler_vers(&depot, sortie.path(), true); + let index = manifeste(sortie.path(), &parutions["fascicules"][0]); + let entree = liste(&index["cartes"]) + .iter() + .find(|c| c["id"] == uid.as_str()) + .unwrap() + .clone(); + let carte = lire(&sortie.path().join(texte(&entree["carte"]))); + assert_eq!( + carte["sens"][0]["libelles"]["fr"]["exemples"], + json!(["Une falaise dont les couches de roche sont visibles."]) + ); +} + #[test] fn manifeste_et_carte() { let (depot, sortie, parutions) = essai(); diff --git a/outils/src/tests/validation.rs b/outils/src/tests/validation.rs index 01001545..c81cd67a 100644 --- a/outils/src/tests/validation.rs +++ b/outils/src/tests/validation.rs @@ -186,6 +186,35 @@ fn forme_sans_trait_union() { assert!(a_erreur(&depot, "forme.trait_union")); } +// ---------------------------------------------------------------- exemples d'un sens + +#[test] +fn exemples_valides() { + let depot = Depot::new(); + depot.modifier(depot.unite("géologie"), |u| { + u["sens"][0]["libelles"]["fr"]["exemples"] = + json!(["Une falaise dont les couches de roche sont visibles."]); + }); + let rapport = depot.valider(); + assert!(erreurs(&rapport).is_empty(), "{}", rapport.en_texte()); +} + +#[test] +fn exemples_non_vides_bornes_et_distincts() { + let depot = Depot::new(); + for exemples in [ + json!([]), + json!([""]), + json!(["a", "b", "c", "d", "e", "f"]), + json!(["Deux fois", "Deux fois"]), + ] { + depot.modifier(depot.unite("géologie"), |u| { + u["sens"][0]["libelles"]["fr"]["exemples"] = exemples.clone(); + }); + assert!(a_erreur(&depot, "schema"), "{exemples}"); + } +} + // ------------------------------------------------------------- attestation (ADR 0056) pub(super) fn attestation(annee: i64, precision: &str) -> Value { diff --git a/schemas/unite.schema.json b/schemas/unite.schema.json index 90950316..2da4cf45 100644 --- a/schemas/unite.schema.json +++ b/schemas/unite.schema.json @@ -131,6 +131,14 @@ "definition": { "description": "Sens actuel, en une phrase. Obligatoire pour un mot découvrable.", "$ref": "communs.schema.json#/$defs/texte" + }, + "exemples": { + "description": "Exemples concrets pour se représenter un mot peu imaginable (une situation, un objet, une scène), rédigés, jamais copiés. Affichés au dos de la carte, sans nommer le mot nécessairement.", + "type": "array", + "minItems": 1, + "maxItems": 5, + "uniqueItems": true, + "items": { "$ref": "communs.schema.json#/$defs/texte" } } } } diff --git a/unites/unt_0vad5yr4.json b/unites/unt_0vad5yr4.json index afc69ca6..7191bc58 100644 --- a/unites/unt_0vad5yr4.json +++ b/unites/unt_0vad5yr4.json @@ -33,7 +33,10 @@ "rang": 1, "libelles": { "fr": { - "definition": "Correspondance entre des éléments de même origine ou de même rôle." + "definition": "Correspondance entre des éléments de même origine ou de même rôle.", + "exemples": [ + "Le bras d’un humain, la nageoire d’une baleine et l’aile d’une chauve-souris : des os disposés de la même façon pour des usages différents." + ] } }, "fait": { diff --git a/unites/unt_0wda7bhe.json b/unites/unt_0wda7bhe.json index a3877060..6ae1cb7a 100644 --- a/unites/unt_0wda7bhe.json +++ b/unites/unt_0wda7bhe.json @@ -33,7 +33,10 @@ "rang": 1, "libelles": { "fr": { - "definition": "Carte dont les surfaces sont proportionnelles à une donnée statistique." + "definition": "Carte dont les surfaces sont proportionnelles à une donnée statistique.", + "exemples": [ + "Une carte d’Europe où chaque pays est gonflé ou rétréci selon sa population." + ] } }, "fait": { diff --git a/unites/unt_118eh36q.json b/unites/unt_118eh36q.json index 1962a35f..a67b3a17 100644 --- a/unites/unt_118eh36q.json +++ b/unites/unt_118eh36q.json @@ -43,7 +43,11 @@ "rang": 1, "libelles": { "fr": { - "definition": "Branche des mathématiques qui étudie les propriétés conservées par déformation continue." + "definition": "Branche des mathématiques qui étudie les propriétés conservées par déformation continue.", + "exemples": [ + "Une tasse et un beignet : on passe de l’une à l’autre en déformant la pâte, sans la couper ni la recoller.", + "Le plan d’un métro, qui garde l’ordre des stations et leurs correspondances, mais pas les distances." + ] } }, "fait": { diff --git a/unites/unt_3b82m32c.json b/unites/unt_3b82m32c.json index 70c7d68b..f75afcca 100644 --- a/unites/unt_3b82m32c.json +++ b/unites/unt_3b82m32c.json @@ -33,7 +33,12 @@ "rang": 1, "libelles": { "fr": { - "definition": "Qui fait entendre plusieurs voix ou plusieurs sons à la fois." + "definition": "Qui fait entendre plusieurs voix ou plusieurs sons à la fois.", + "exemples": [ + "Un chœur dont chaque groupe de voix chante sa propre mélodie en même temps.", + "Un piano ou un orgue, qui font sonner plusieurs notes à la fois.", + "Une sonnerie de téléphone qui joue un accord plutôt qu’une seule note." + ] } }, "fait": {