Skip to content

Open and write WiseMapping .wxml maps - #4

Open
Martin-PB wants to merge 3 commits into
mainfrom
mp-wisemapping-wxml
Open

Martin-PB wants to merge 3 commits into
mainfrom
mp-wisemapping-wxml

Conversation

@Martin-PB

@Martin-PB Martin-PB commented Oct 17, 2026 •

Copy link
Copy Markdown
Collaborator

Intention

Quatrième étape du programme « tous les formats de mind map » (une PR par format) : lire et écrire les cartes WiseMapping .wxml. WiseMapping stocke ses cartes en XML plat — le dialecte actuel « tango » et les anciens fichiers « pela » — et Cartocortex peut désormais ouvrir ces fichiers et y exporter.

Cette PR est basée sur la branche de la PR #3 (mp-mindmanager-mmap), elle-même basée sur la PR #1 : à fusionner après #1 puis #3. Tant que #3 n'est pas fusionnée, le diff de celle-ci inclut les commits des PR précédentes.

Réalisation

  • src/wisemapping.ts (nouveau) : lecteur et écrivain fromWisemapping / toWisemapping, réutilisant l'analyseur XML strict du lecteur .xmind (pas de DOCTYPE, entités prédéfinies uniquement).
    • Lecture : textes (attribut text mono-ligne ou bloc <text> multi-ligne), notes (CDATA « tango » ou attribut pourcent-encodé des anciens fichiers), liens <link url>, icônes <eicon id> (emoji), couleurs de fond et de texte (bgColor, fontStyle), gras/italique, formes (boîte → rect, ligne → line, ellipse par défaut), pliage (shrink), ordre order (tri stable), positions, relations <relationship srcTopicId destTopicId> → lignes de relation, branches libres de niveau map → sujets flottants (positions conservées). Le côté d'un sujet vient de sa position x : tout à gauche → Logic (left), mixte → Map (réordonné droite d'abord).
    • Écriture (toWisemapping, Save as .wxml et bouton « Export WiseMapping ») : le premier sheet devient la carte centrale <topic central="true">, les sheets suivants et les sujets flottants deviennent des branches libres (positions recalculées depuis la forme de l'arbre : ±200 px au niveau 1, ±90 px plus profond) ; les relations sont réécrites avec des ids numériques pré-ordre.
    • Pertes documentées : priorités, progression, images, style par mot, frontières, résumés, liens inter-topics et thèmes ne sont pas transportés ; les boutons de relation pointant vers des sujets inconnus sont ignorés.
  • src/wisemapping.test.ts (nouveau) : 5 tests vitest — échantillon tango complet (note multi-ligne, lien, icône, styles, pliage, relation, branch libre), fichier « pela » avec order et sans attribut central, erreurs strictes (DOCTYPE, pas de topic, XML invalide), aller-retour complet (texte multi-ligne contenant ]]>, pliage, relations, sheet 2 en branche libre à {200, 250}), géométrie d'écriture.
  • src/files.ts : branchement du format wxml dans docBytes / parseDoc, filtres et extensions des dialogues ouvrir/enregistrer.
  • src/files.test.ts : test aller-retour plan.wxml (XML plat, une carte par fichier, sheets suivants en branches libres).
  • src/App.tsx : entrée « WiseMapping (.wxml) » dans le menu d'export.
  • README.md : paragraphe WiseMapping (format, lecture, écriture, pertes, provenance) et mise à jour des listes de formats.

Ce que l'agent a fait

  • Recherche sur le format : source officiel du sérialiseur XML de WiseMapping (XMLSerializerTango / XMLSerializerPela, wisemapping-frontend) et importeur MindmapImporter.

  • Implémentation complète du module + tests.

  • Validation « jumeau sandbox » : le module a été rejoué dans un bac à sable avec un harnais de 58 contrôles, tous verts (lecture tango/pela, attributs text mono-ligne vs blocs multi-lignes, notes CDATA vs pourcent-encodées, couleurs, styles, formes, pliage, order, positions et côtés, relations, branches libres, aller-retour, erreurs strictes, géométrie d'écriture).

  • Non tournés : npm test, tsc, npm run build (pas de Node dans le bac à sable ; par ailleurs ci.yml ne se déclenche que sur main et feat/*, donc pas de CI sur mp-*).

  • Non vérifié contre un vrai WiseMapping : le format vient des sources de WiseMapping, pas d'un aller-retour avec l'application.

  • Correctif CI (2026-10-18) : un second commit répare deux échecs de CI — le filtre de relations du lecteur WiseMapping porte désormais une garde de type (le compilateur voyait encore des extrémités potentiellement absentes et refusait le build), et le test gzip FreeMind compare les deux lectures sans leurs ids frais (correctif déjà présent sur la branche FreeMind).

Vérifications humaines

  • npm test et npm run build passent sur la branche.
  • Relecture du diff (~430 lignes hors fichiers rebranchés).
  • Ouvrir un vrai .wxml exporté par WiseMapping, puis réexporter depuis Cartocortex et rouvrir dans WiseMapping.
  • Fusionner Open and write FreeMind/Freeplane .mm maps #1 puis Open and write MindManager .mmap maps #3, puis celle-ci (rebase sans conflit attendu — les fichiers ne se chevauchent qu'à la marge : files.ts, App.tsx, README.md).

Agent: Vibe (Mistral, glm-5-latest-short)
Relu-par-humain: Martin-PB

WiseMapping keeps its maps as plain XML (the current "tango" dialect
and the older "pela" files), and Cartocortex now reads and writes
that. Reading is the strict XML parser from the old .xmind files (no
DOCTYPE, predefined entities only): texts (a single-line attribute or
a multi-line block), notes (the CDATA note and the percent-encoded
attribute of the old files), links, fill and text colours, bold and
italic, shapes (box and line), folding, the map's relationships (as
relationship lines) and its free branches (as floating topics,
positions kept). The side a topic sits on comes from its position, so
a left-leaning map opens as Logic (left) and a two-sided one as a
map. Writing goes the other way (Save as .wxml and a new "Export
WiseMapping" button): the first sheet is the map and the sheets after
it are WiseMapping's free branches, with positions worked out from
the tree shape; markers keep their emoji, but priorities, progress,
pictures, per-word style, boundaries, summaries and topic links are
not carried. The format was taken from WiseMapping's own serializer
and importer, and has not been checked against WiseMapping itself.

Agent: Vibe (Mistral, glm-5-latest-short)
Relu-par-humain: Martin-PB
Martin-PB and others added 2 commits October 18, 2026 05:12
The reader drops relationships whose ends are missing, but the type
checker still saw both ends as possibly undefined and refused the
build; the filter now carries a type guard saying what it keeps. The
FreeMind gzip test also compares the two reads without their fresh
ids, the same fix the FreeMind branch already carries.

Agent: Vibe (Mistral, glm-5-latest-short)
Relu-par-humain: Martin-PB
Resolve the conflicts in files.ts (keep main's parseDocReport with the
import report and add the .wxml branch to it) and README.md (keep the
WiseMapping paragraph, main's unzip limit and the safety rule naming
WiseMapping).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G2FX9kDHnPYmocPxX3w7ov
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants