# Acadenice Patches Liste des patches custom appliques sur le fork Acadenice de Docmost. Ce document est maintenu manuellement pour faciliter le rebase upstream. Repo upstream : `github.com/docmost/docmost` Branche fork : `acadenice/main` ## Conventions - Chaque patch est commit isole avec scope `feat(rebrand)` / `feat(custom)` / etc. - Les modifications in-line de fichiers upstream sont documentees ici avec rationale. - Les nouveaux fichiers (extensions Tiptap custom, hooks, etc.) vont dans des emplacements dedies pour minimiser les conflits de rebase. --- ## 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 `