import type { Class_Sankey } from '../types/Sankey'; export declare const CURRENT_FORMAT_VERSION = 3; /** * Version « effective » servant à piloter les migrations au chargement. * - Fichier avec `format_version` explicite ⇒ déjà au format courant : on renvoie * `current_version` (toutes les migrations legacy à seuil no-op). * - Sinon ⇒ on garde la version pointée du fichier (chaîne de migrations legacy). * Pur et sans dépendance : testable en isolation. */ export declare function effectiveLoadVersion(raw_version: string | undefined, format_version: number | undefined, current_version: string | undefined): string | undefined; export type Type_LangMap = { [lang: string]: string; }; /** Alias historique (doc markdown) — même structure. */ export type Type_DocMarkdownMap = Type_LangMap; /** Normalise un code langue en 2 lettres minuscules ('en-US' -> 'en'). */ export declare function normalizeLang(lang: string | undefined): string; /** Alias historique. */ export declare const normalizeDocLang: typeof normalizeLang; /** * Sérialise la map pour le JSON. Renvoie `undefined` si vide (le champ ne * doit alors pas être écrit — ou être écrit '' selon le champ), une string si * une seule langue (format historique), sinon la map filtrée des entrées vides. */ export declare function serializeLangMap(map: Type_LangMap): string | Type_LangMap | undefined; /** Alias historique. */ export declare const serializeDocMarkdown: typeof serializeLangMap; /** * Relit le champ (string historique ou map) vers une map { langue -> texte }. * `file_lang` = langue déclarée du diagramme (clé `language`), utilisée pour * ranger une string historique. */ export declare function parseLangMap(raw: unknown, file_lang: string | undefined): Type_LangMap; /** Alias historique. */ export declare const parseDocMarkdown: typeof parseLangMap; /** * Résout la map vers le texte à afficher pour la langue active, avec repli * en→fr→première disponible (aligné sur la résolution des titres de * tutoriels). Renvoie '' si la map est vide. */ export declare function resolveLangMap(map: Type_LangMap, lang: string | undefined): string; /** Alias historique. */ export declare const resolveDocMarkdown: typeof resolveLangMap; /** * Compare deux versions « pointées » (ex. '0.92', '1.1', '1.1.4') segment par * segment, numériquement (segments manquants traités comme 0). Renvoie vrai si * `version` est STRICTEMENT antérieure à `target`. * * Le schéma de versions du projet mêle des numéros à 2 segments ('0.92', '1.0', * '1.1') et à 3 segments ('1.1.1', '1.1.4', '1.1.6'). La comparaison via * `Number(version)` utilisée ailleurs pour les seuils < 0.94 ne fonctionne donc * PAS au-delà de 1.1 (`Number('1.1.4')` = NaN) : on parse ici proprement chaque * segment. Une version absente (`undefined` — fichiers pré-0.9 sans champ * `version`) est considérée antérieure à toute cible (le fichier le plus ancien). */ export declare function isVersionBelow(version: string | number | undefined, target: string): boolean; /** * Valide la forme du JSON racine d'un diagramme Sankey via `sankeyRootSchema`. * Renvoie la liste des champs problématiques (vide = OK). Pure : testable en * isolation et réutilisable côté outillage. */ export declare function validateSankeyRootJSON(json: unknown): string[]; /** * Issue #191 — rétro-compatibilité de la césure des libellés. L'attribut * `wrap_long_words` (césure d'un mot UNIQUE trop long par insertion d'un tiret, * via breakLongWords dans DrawLabel) a été introduit avec un défaut `false` * (066b1847, v0.93) puis rebasculé à `true` lors du refactor de la config de * labels (a9efa282, v1.1.4). Les fichiers antérieurs ne sérialisent pas la clé * (absente de `local`) → ils héritent du nouveau défaut `true` et leurs libellés * mono-mots se retrouvent coupés (IMPORTATIONS → IMPORTATIO-NS). Le retour à la * ligne MULTI-mots (d3-textwrap sur les espaces, piloté par box_width) est * antérieur (2021) et inchangé : il n'est PAS concerné. * * Pour préserver le rendu d'origine, on force wrap_long_words=false sur les * fichiers < 1.1.4 UNIQUEMENT quand la clé est absente du nœud/lien/conteneur * (on n'écrase jamais un choix explicite). Les fichiers ≥ 1.1.4 gardent le * comportement courant ; à la ré-sauvegarde, le `false` est figé explicitement * (≠ défaut → sérialisé), donc la migration ne s'applique qu'une fois. */ export declare function applyWrapLongWordsRetrocompat(sankey: Class_Sankey, version: string | undefined): void; /** Modes d'affichage globaux restituables (cf. Type_PositionMode côté PublishOptions). */ export type Type_LoadedPositionMode = 'absolute' | 'proportional' | 'scale_adapted'; /** * Issue #369 — Mode d'affichage GLOBAL (`styles_dict['default'].shape_position_type`) * effectivement appliqué au chargement, à partir de celui lu dans le fichier. * * Jusqu'ici (#1231) TOUT fichier se chargeait en `absolute` : le mode était réputé « vue * transitoire ». Conséquence relevée au #369 : « échelle adaptée » — seul moyen de garder une * taille de diagramme constante d'un datatag à l'autre — devait être re-choisi à chaque * ouverture, et un diagramme publié ne pouvait pas être livré dans ce mode. Les modes * d'AFFICHAGE (`proportional`, `scale_adapted`) sont donc restitués tels quels : le sélecteur * rouvre sur le mode enregistré, et le changement de datatag suit ce mode. * * RÈGLE DU PREMIER RENDU (arbitrage utilisateur du 2026-08-05) : le mode restitué est ARMÉ, * pas appliqué. Le diagramme s'ouvre exactement tel qu'il a été enregistré — dessin en absolu, * à l'échelle du fichier — et le mode ne se fait sentir qu'au PREMIER CHANGEMENT DE DATATAG, * qui est précisément ce qu'il gouverne. C'est la suspension d'ouverture qui porte cette règle * (`Class_DrawingArea.suspendPositionModeUntilDataChange`, armée juste après cet appel). * Nécessaire parce qu'un fichier n'écrit pas ce qu'il AFFICHE dans un mode d'affichage : les * positions persistées sont les CENTRES (jamais la disposition comprimée du %), et le * `user_scale` est l'échelle DÉJÀ adaptée. Le couple `scale_adapted_ref_scale` / `_magnitude` reste * indispensable pour la suite : c'est lui qui, à la levée de la suspension, redonne l'échelle * de base au lieu de recomposer le ratio sur l'échelle adaptée du fichier. * * Deux cas restent ramenés à `absolute` : * - `parametric` (mode « écart » hérité) : c'est lui qui décide si u/v font autorité au * chargement (cf. DrawingAreaPersistence.fromJSON) et le sélecteur ne le propose pas — le * restituer rendrait la mise en page du fichier illisible sans moyen d'en sortir. Le * marquage `parametric` PAR NŒUD (« Ecartement »), lui, reste persisté et respecté. * - toute valeur absente ou inconnue (fichier antérieur, `relative` posé par erreur sur le * style global) : rétro-compatibilité, un fichier sans l'attribut s'ouvre en `absolute`. * * Pur et sans dépendance : testable en isolation. */ export declare function positionModeOnLoad(incoming: string | undefined): Type_LoadedPositionMode;