fix(ai): accents dans les chemins et resolution des chemins prefixes par le vault (BUG-042)
CI / lint (push) Successful in 1m16s
CI / security (push) Successful in 50s
CI / test (push) Successful in 2m24s
CI / build (push) Successful in 47s
CI / e2e (push) Successful in 10m35s

- accents : classes de caracteres Unicode (\p{L}\p{N}\p{M}) pour les motifs
  de liens et _looksLikePath (PATH_NAME_RE) -> les chemins/fichiers accentues
  produisent enfin un lien cliquable ; comparaison de chemins normalisee NFC
  (_normKey), donc une mention decomposee (e + accent combinant, style macOS)
  correspond a une entree d'index precomposee, et inversement.
- prefixe de vault : _splitVaultPrefix() retire un premier segment egal au nom
  d'un vault connu (TestVault/Recettes/Pizza Maison.md) ; _fetchPathsForVault()
  interroge l'index de CE vault sans ecraser le cache du vault actif ;
  _openFileLink/_revealPath recoivent le vault cible ; repli 'retirer le
  premier segment' si le prefixe ne correspond a aucun vault connu.

Tests : frontend IA 62/62 (+5), 9 suites JSDOM, validate-imports 36 modules,
pytest 963 passed / 6 skipped. Verifie aussi contre l'instance live sur donnees
reelles accentuees/espaces (Recettes/Preparation.md, Recettes/Pat... ) : 8/8.
This commit is contained in:
2026-09-14 13:37:23 -04:00
parent 12a53d647e
commit c3e6841293
5 changed files with 224 additions and 43 deletions
+20 -7
View File
@@ -64,21 +64,34 @@ Avant d'agir, `_activatePath()` **résout** le chemin contre l'index du vault
(segment de tête omis par le modèle), puis basename unique. Les chemins non
résolus copient le nom au lieu d'ouvrir un lien mort — plus de `File not found`.
### 4. Espaces dans les noms de fichiers et les chemins (BUG-042)
### 4. Espaces, accents et préfixe de vault dans les chemins (BUG-042)
Les noms de fichiers/dossiers pouvant contenir des espaces, la détection est
adaptée :
Les noms de fichiers/dossiers pouvant contenir des espaces et des accents, la
détection et la résolution sont adaptées :
- **Liens markdown** : la cible peut contenir des espaces, être encadrée par
`<…>` ou porter un `"titre"` ; les URL percent-encodées (`%20`) sont décodées.
- **Code inline** : `` `Ma note.md` `` / `` `Mon dossier/Ma note.md` `` sont
reconnus (`_looksLikePath` accepte les espaces en gardant un jeu de caractères
strict, ce qui rejette les extraits de code et commandes shell).
- **Code inline** : `` `Ma note.md` `` / `` `Recettes/Préparation.md` `` sont
reconnus (`_looksLikePath` utilise `PATH_NAME_RE`, une classe Unicode
`\p{L}\p{N}\p{M}` — les accents sont acceptés, le jeu de caractères reste
strict pour rejeter extraits de code et commandes shell).
- **Mentions brutes** : une mention avec espaces n'est liée **que si elle existe
réellement dans l'index du vault** (`_linkifySpacePaths` +
`_confirmPathInCache`), et l'acceptation se fait sur le **plus long suffixe
aligné sur un mot** — ainsi « Ouvre Mon dossier/Ma note.md » ne crée pas de
lien englobant « Ouvre » et la prose ordinaire n'est jamais liée à tort.
lien englobant « Ouvre » et la prose ordinaire n'est jamais liée à tort. Les
chemins sans espace mais accentués sont liés par le motif `PATH_WITH_DIR_RE`,
lui aussi Unicode-aware.
- **Normalisation Unicode** : `_normKey()` compare en NFC + minuscules, donc une
mention décomposée (`e` + accent combinant, comme sur macOS) correspond à une
entrée d'index précomposée, et inversement.
- **Préfixe de vault** : `_splitVaultPrefix()` retire un premier segment égal au
nom d'un vault connu (`TestVault/Recettes/Pizza Maison.md` →
`Recettes/Pizza Maison.md`). La résolution interroge l'index **de ce vault**
(`_fetchPathsForVault`, fetch ponctuel sans écraser le cache du vault actif),
puis `_openFileLink`/`_revealPath` reçoivent le vault cible. Si le préfixe ne
correspond à aucun vault connu, `_resolveExistingPath` retente en retirant le
premier segment.
## Tests