Bump minAppVersion to 1.13.0 (obsidian@1.13.1 typings) to use the
declarative getSettingDefinitions() API and ButtonComponent.setDestructive(),
replacing the deprecated display() and setWarning(). Settings tab
converted to declarative settings with render escape hatches. Static
imports of fs/path replace remaining require() calls in main.ts.
- Descriptions ajoutées aux eslint-disable no-var-requires (require()
dynamique requis : esbuild CJS ne peut pas import statiquement les
modules Node.js natifs)
- Suppression des assignations style.display/style.flex au profit de
classes CSS (pseudobs-fw-visible, flex sur .pseudobs-corpus-class-heading)
- Remplacement de window.prompt()/confirm() par des modales Obsidian
(ConfirmModal, TextInputModal dans ui/SimpleModals.ts)
- Handlers d'événements async wrappés en void (...)() pour éviter les
promesses non gérées
- Typage des résultats JSON.parse (scope/mappings) et des callbacks
processFrontMatter, suppression des casts `as TFile` inutiles
- i18n: add Russian (ru) and Spanish (es) locales (~240 keys each)
- feat: markdownToNoScribeHtml — reconstruct pseudonymized noScribe HTML
with word-level ts_ anchors via proportional index mapping on words.json;
add export-as-html command, panel button, notice.htmlExported
- fix: autoConvert now skips files created in exports/mappings folders
(prevented re-import of freshly written VTT/SRT/HTML exports)
- fix: pseudonymizeActiveFile respects exportMirrorClasses — intermediate
.pseudonymized.md is now written into the correct class subfolder
- fix: extract getClassSub() helper shared by resolveExportPath and pseudonymizeActiveFile
- fix: "Nouvelle classe" button in corpus panel now opens CorpusModal
instead of window.prompt (blocked in Electron)
- refactor: remove next-to-source export destination option
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Onglet Corpus
- Organisation par classes (créer, supprimer, déplacer fichiers)
- Détection statut par fichier : règles, version pseudo, export final
- Destination des exports finaux configurable : vault / à côté / dossier externe
- Option miroir de la structure de classes dans les exports
- FolderSuggest : autocomplete dossiers vault dans settings, onboarding et corpus
Exceptions dans la modale de scan
- MappingScanReviewModal : modale de contexte par occurrence (✓/✗/⚠)
- Initialisation des décisions depuis ignoredOccurrences persistées
- Bouton 'Enregistrer les exceptions' séparé d'Appliquer
- IgnoredOccurrence persistée dans mapping.json
- Surlignage rouge positionnel (context-aware, par occurrence précise)
- Exceptions exclues du moteur de remplacement (findSpansForRule)
- Section Exceptions dans l'onglet Mappings
- Clic droit 'Déclarer une exception' sur terme orange
Exports
- Re-export SRT/CHA depuis Markdown pseudonymisé (markdownToSrt, markdownToCha)
- resolveExportPath : mirroring de classes depuis le mapping pour les fichiers pseudonymisés
- writeExport : vault / next-to-source / external
- Onglet Exports : bouton adapté selon dossier exports vs source
Renommage en cascade
- vault.on('rename') : cascade automatique vers mapping, words, exports, audio, source
- renameFileAndRelated : bannière de warning dans le panneau
- Mise à jour pseudobs-source et pseudobs-audio dans le frontmatter
- moveFileToClass : déplacement audio (basename + pseudobs-audio)
Warnings
- Bannière au-dessus des onglets si le nom contient un terme pseudonymisable
- Bouton ✏ (saisie libre) + ✨ (suggestion transcript_N)
- Statuts clarifiés : Actif/Ignoré/Partiel/Suggéré
- getValidatedFor inclut 'partial'
CSS : esbuild copie styles.css en mode dev via plugin onEnd
Replace fs.existsSync + fs.writeFileSync with vault.adapter.exists()
and vault.adapter.writeBinary() using vault-relative paths.
Eliminates direct filesystem access outside the Obsidian vault API.
- i18n: all UI strings externalized in locales/en.json + fr.json;
language selectable in wizard (new Language step) and settings
- Wizard: new Storage step with 1-vault-per-corpus recommendation
- Settings: reorganized in 6 sections ordered by frequency of use;
language dropdown at the top
- Corpus organization: CorpusModal + ClassSelectModal;
named classes with mirrored transcriptions/mappings/exports folders;
class selection prompt on import
- Broad-scope warning for name rules (RuleModal + EditRuleModal):
warning callout for folder/vault scope; success callout for file scope
- Mappings tab: grouped by scope (File/Folder/Vault);
active-file-only filter checkbox (checked by default);
getAllRulesWithLocation() added to ScopeResolver
- EditRuleModal, QuickPseudonymizeModal fully migrated to t()
- README, CHANGELOG, ROADMAP translated to English;
French versions archived as *.fr.md
- esbuild: dev mode outputs directly to test_vault for hot reload
- Format DictionaryFile v1.1 : roles, configSchema, config, author, doi
- DictionaryLoader : index de détection, résolution de classes, scanText (n-grammes), nextReplacement
- Repo dédié pseudobsidian-dictionaries + fr-communes.dict.json (34 957 communes GeoAPI INSEE)
- Wizard : catalogue de dictionnaires téléchargeables depuis le repo dédié (icônes cloud-download/check)
- scripts/build-cities.mjs : génération du dictionnaire communes
- DictScanReviewModal : modale de révision en cards (contexte, préfixe éditable, index calculé)
- MappingScanReviewModal : modale de révision pour le scan par règles existantes
- Onglet Dictionnaires : mini cards avec checkbox, scan individuel, scan groupé
- Suppression onglet Candidats : scan règles → Mappings, scan NER → NER
- RuleModal : suggestions dictionnaire séparées de Coulmont
- docs : README, CHANGELOG, ROADMAP, SPECS §6 mis à jour
- Replace builtin-modules with Node.js native builtinModules
- Add @codemirror/view and @codemirror/state to devDependencies
- Remove unused imports (MappingFile, MappingStatus, MappingRule, PseudonymizationEngine)
- Remove unused variable decision in OccurrencesModal
- Use window.setTimeout for popout window compatibility
- Use FileManager.trashFile() instead of Vault.delete()
- Use activeDocument instead of document for popout window compatibility
- Update LICENSE to CC BY 4.0 (recognized by GitHub)
Remove plugin name from settings heading (obsidianmd/settings-tab/no-manual-html-headings compliance).
Sentence case /skip applied for proper nouns (institution names, person names) in academic context.
Floating promises: add `void` to all unhandled refreshHighlightData() calls
in callbacks and event listeners; extract processFilePicker() to fix the async
event listener returning a Promise where void was expected.
Inline styles: replace all style.cssText and setAttribute('style') with CSS
classes (pseudobs-hidden-input, pseudobs-legend-*, pseudobs-suggestions-*,
pseudobs-occ-*, pseudobs-disabled-input) across OccurrencesModal, RuleModal,
QuickPseudonymizeModal, EditRuleModal, and main.ts.
Settings headings: replace all createEl('h2'/'h3') with new Setting().setHeading()
in PseudObsSettingTab (5 headings).
Sentence case: fix linter-flagged occurrences (placeholder text, legend labels,
button text); 4 residual occurrences on legitimate proper nouns (Baptiste Coulmont,
Jefferson, ICOR, Synology Drive) left for human reviewer.