Commit graph

25 commits

Author SHA1 Message Date
Axelle Abbadie
7c077e7d06 fix: rendre le plugin réellement compatible Obsidian 1.12.7
minAppVersion avait été abaissé à 1.12.7 sans vérifier l'usage effectif
d'API 1.13+ : le bot du portail communautaire a détecté que
PseudObsSettingTab n'implémentait plus display() (fallback requis avant
1.13, sinon l'onglet de réglages reste vide) et que deux boutons
utilisaient ButtonComponent.setDestructive() (1.13.0), sans équivalent
avant cette version.

- settings.ts : ajout de display() en repli sur getSettingDefinitions(),
  et remplacement de this.update() (1.13+) par refresh(), qui retombe sur
  display() si l'API déclarative est absente.
- EditRuleModal.ts / SimpleModals.ts : setDestructive() → setWarning()
  (équivalent disponible depuis 0.11.0, toujours supporté en 1.13+).
2026-07-17 17:29:28 +02:00
Axelle Abbadie
b74f36e3cc fix: perte de chevauchements entiers à l'import HTML noScribe
Les noms d'ancre ts_ dont le suffixe locuteur contient des caractères
hors \w (ex. "//S01" quand une annotation de chevauchement est tapée
juste avant une coupure de segment) étaient rejetés par TS_NAME_RE,
faisant disparaître silencieusement tout le texte de l'ancre.
2026-07-09 23:41:41 +02:00
Axelle Abbadie
af0ae3d720 fix: avoid unnecessary type assertion when importing audio buffers 2026-06-10 10:30:03 +02:00
Axelle Abbadie
8db091faf6 fix: address remaining community bot lint recommendations
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.
2026-06-10 10:25:23 +02:00
Axelle Abbadie
6193a3b9e5 fix: corrections lint communauté Obsidian (errors bloquantes + warnings)
- 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
2026-06-10 10:03:13 +02:00
Axelle Abbadie
928ff8d42b feat: i18n ru/es, export HTML noScribe word-level, fix auto-convert + export paths
- 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>
2026-05-20 00:07:39 +02:00
Axelle Abbadie
b6fdbbfe67 fix: rename cascade — capture TFile state before vault.rename, processFrontMatter for audio
- renameFileAndRelated: capture oldFilePath before vault.rename (TFile mutated in-place)
- cascadeRelatedRename: capture oldAudioName before rename (same mutation issue)
- cascadeRelatedRename: update both store-level and rule-level scope.path in mapping.json
- moveFileToClass: same store-level scope.path fix
- All frontmatter updates via app.fileManager.processFrontMatter (not regex)
- Audio strategy b: rename pseudobs-audio referenced file even when basename differs
2026-05-17 13:26:55 +02:00
Axelle Abbadie
ae11138c63 feat: corpus UI, exception-aware scan, rename cascade, export destination
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
2026-05-17 12:39:53 +02:00
Axelle Abbadie
ef9ffc7a99 chore: bump to 0.1.5 2026-05-17 02:04:00 +02:00
Axelle Abbadie
eb62c50373 feat: noScribe import, scan modal candidats, exceptions surlignées
Intégration noScribe (Phase 10)
- VttParser : WebVTT standard avec word timestamps (Whisper)
- NoScribeHtmlParser : HTML Qt Rich Text noScribe, extraction locuteurs S00/S01, audio source
- NoScribeVttParser : VTT noScribe v0.7 (cues splitées, labels SXX:, entités HTML)
- TranscriptConverter : format Markdown noScribe (**S00** [HH:MM:SS] : texte), extractWordData → .words.json
- Import audio automatique depuis meta tag HTML ou dossier source VTT
- Re-export VTT pseudonymisé depuis .md + .words.json (commande "Exporter en VTT")
- Redaction.ts : caviardage par syllabes (🀫)

Scan modal avec candidats
- MappingScanReviewModal : colonne occurrences cliquable → OccurrencesContextModal
- OccurrencesContextModal : cartes ✓/✗/⚠ par occurrence, callback sans application immédiate
- Bouton "Enregistrer les exceptions" séparé d'Appliquer

Exceptions
- IgnoredOccurrence dans types.ts + ignoredOccurrences sur MappingRule
- Persistance dans mapping.json, chargement au démarrage
- Surlignage rouge (pseudobs-exception, sensible à la casse via collectExact)
- Section "Exceptions" dans l'onglet Mappings avec cartes contextuelles et suppression
- Priorité 0 dans le highlighter (gagne sur orange/bleu/vert)

Corrections
- getValidatedFor() : inclut 'partial' comme état actif
- Labels de statut clarifiés : "Actif", "Ignoré", "Partiel", "Suggéré"
- Scan button corrigé dans PseudonymizationView (occurrences manquantes dans MappingRuleResult)
- PseudonymHighlighter : collectExact définie, exceptionRanges orphelin supprimé

Tests : 149 tests, 10 suites
2026-05-17 01:25:20 +02:00
Axelle Abbadie
eab25b2381 fix: remove fs/path — use vault.adapter for WASM file access
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.
2026-05-16 01:19:49 +02:00
Axelle Abbadie
503588e7fc feat: i18n, corpus organization, settings redesign, scope warning (Phase 10)
- 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
2026-05-16 01:06:01 +02:00
Axelle Abbadie
a46903c4e4 fix: violations portail Obsidian + TS lint
- Casts inutiles supprimés : as HTMLButtonElement (×2), as EntityCategory, as MappingRule[], ! sur dictionaryLoader
- Imports inutilisés supprimés : OccurrencesModal (main.ts), MappingRule (PseudonymizationView)
- CSS :has() → this.modalEl.addClass('pseudobs-modal-review-outer') dans DictScanReviewModal et MappingScanReviewModal
2026-05-14 01:34:36 +02:00
Axelle Abbadie
4e91c166e8 feat: système de dictionnaires structurés v1.1 (Phase 9)
- 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
2026-05-14 01:08:25 +02:00
Axelle Abbadie
a15491c178 chore: bump to 0.1.2, replace setInterval with Promise sharing in OnnxNerScanner 2026-05-13 11:50:23 +02:00
Axelle Abbadie
631803f8f4 feat: dictionaries tab — list, entry count, import, delete 2026-05-13 11:21:11 +02:00
Axelle Abbadie
79bc9fa6d4 fix: address all Obsidian community portal warnings on dev
- Remove detachLeavesOfType from onunload
- Add void to revealLeaf call
- Remove eslint-disable comment, type TransformersModule properly
- window.setInterval/clearInterval in OnnxNerScanner
- Remove unused fs import, type ScopeResolver JSON.parse casts
- Remove unused Setting/RuleLocation imports
- window.setTimeout in OnboardingModal and PseudonymizationView
- Wrap async event listeners with void (async () => {})()
- activeDocument instead of document in OnboardingModal
- FileManager.trashFile() instead of Vault.delete()
- Remove unused catch variable e
- Fix unnecessary escape character
- Replace deprecated activeLeaf with getActiveViewOfType
- Add .github/workflows/release.yml for artifact attestations
2026-05-13 03:18:34 +02:00
Axelle Abbadie
d62e43f68b merge: integrate main (0.0.6 fixes) into dev — v0.1.0 2026-05-13 01:59:59 +02:00
Axelle Abbadie
a094a523e6 fix: v0.0.6 — GPL-3.0 license, minAppVersion 1.6.6, portal compliance
- License: GPL-3.0 (GitHub-detectable, replaces CC BY 4.0)
- minAppVersion bumped to 1.6.6 — enables FileManager.trashFile()
- 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 in OccurrencesModal
- window.setTimeout and activeDocument for popout window compatibility
- Explicit type casts on JSON.parse calls (no unsafe any)
2026-05-13 01:01:07 +02:00
Axelle Abbadie
6c103fe1dd fix: revert trashFile, add explicit type casts for any warnings 2026-05-13 00:28:06 +02:00
Axelle Abbadie
31a93b00f5 fix: address Obsidian community portal warnings — v0.0.5
- 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)
2026-05-13 00:15:51 +02:00
Axelle Abbadie
b9a37f8306 Pre-v0.1.0 2026-05-12 22:15:36 +02:00
Axelle Abbadie
d3d9437897 chore: bump version to 0.0.4 — community plugin review fix
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.
2026-05-12 16:31:00 +02:00
Axelle Abbadie
ebac4531f7 fix: address Obsidian community plugin review bot issues
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.
2026-05-12 11:13:22 +02:00
Axelle Abbadie
d216e81fb2 init 2026-05-12 01:55:27 +02:00