diff --git a/ACADENICE_PATCHES.md b/ACADENICE_PATCHES.md index 9d86e0be..ed635604 100644 --- a/ACADENICE_PATCHES.md +++ b/ACADENICE_PATCHES.md @@ -14,6 +14,71 @@ Branche fork : `acadenice/main` --- +## Patch 011 — R3.4 dual editor (WYSIWYG + markdown source) + +**Date** : 2026-05-08 +**Scope** : toggle WYSIWYG <-> raw markdown source, custom-node round-trip +**Rationale** : permet aux utilisateurs power-users d'editer le source markdown +directement, avec une conversion aller-retour complete preservant les nodes +Acadenice custom (database-view, wikilink, mention). + +### Architecture + +- Source de verite : Tiptap JSON (persiste en DB). Le markdown est une vue. +- Mode persist : localStorage `acadenice:editor-mode:` par page. +- Switch lossy : modal de confirmation listant les elements alteres. +- Save : en mode markdown, le doc Tiptap est maintenu sync (setContent) a chaque + keystroke pour que le mecanisme save Docmost natif reste fonctionnel. + +### Syntaxe custom nodes en markdown + +| Node | Syntaxe markdown | +|------|-----------------| +| `database-view` | `[[!db tableId=X viewId=Y viewType=Z]]` | +| `wikilink` | `[[Page Title]]` ou `[[Page Title\|alias]]` | +| `mention` | `@(displayName)` | + +Choix : tokens entre `[[...]]` pour etre lisibles et reversibles. Le prefixe +`!db` distingue les database-view des wikilinks. Les mentions encodent le userId +(UUID) pour eviter la necessite d'une resolution serveur au re-parse. + +### Fichiers crees + +| Fichier | Role | +|---------|------| +| `apps/client/src/features/acadenice/dual-editor/services/custom-node-serializers.ts` | Registre des serializers custom (databaseView, wikilink, mention) | +| `apps/client/src/features/acadenice/dual-editor/services/markdown-converter.ts` | `tiptapToMarkdown` + `markdownToTiptap` — converter custom sans dep externe | +| `apps/client/src/features/acadenice/dual-editor/hooks/use-editor-mode.ts` | Jotai atom `editorModeAtom` + `useEditorMode` hook + `initEditorMode` | +| `apps/client/src/features/acadenice/dual-editor/components/mode-toggle-button.tsx` | Bouton toggle (IconCode / IconEye) dans la toolbar | +| `apps/client/src/features/acadenice/dual-editor/components/markdown-editor.tsx` | Textarea monospace auto-resize (Tab -> 2 espaces) | +| `apps/client/src/features/acadenice/dual-editor/components/dual-editor.tsx` | Wrapper WYSIWYG / markdown avec modal warning lossy | +| `apps/client/src/features/acadenice/dual-editor/__tests__/markdown-converter.test.ts` | 61 tests round-trip (JSON->MD->JSON et MD->JSON->MD) | +| `apps/client/src/features/acadenice/dual-editor/__tests__/custom-node-serializers.test.ts` | 12 tests unitaires serializers | +| `apps/client/src/features/acadenice/dual-editor/__tests__/use-editor-mode.test.ts` | 4 tests persistence localStorage | + +### Fichiers modifies (patches upstream) + +| Fichier | Modification | +|---------|-------------| +| `apps/client/src/features/editor/full-editor.tsx` | +import DualEditor + wrap `` avec `` | +| `apps/client/public/locales/en-US/translation.json` | +8 cles `dual_editor.*` | +| `apps/client/public/locales/fr-FR/translation.json` | +8 cles `dual_editor.*` traduits | + +### Nouvelles dependances requises + +Aucune. Le converter est custom TypeScript pur. L'editeur markdown utilise une +`