Commit graph

47 commits

Author SHA1 Message Date
Axelle Abbadie
0b032b82a4 docs: changelog v0.1.7 2026-06-10 10:36:36 +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
4ceb2a6a4f feat: export EAF (ELAN) depuis Markdown noScribe
- markdownToEaf() — génère un .eaf FORMAT 3.0 avec tiers par locuteur,
  TIME_SLOTs dédupliqués+triés, MEDIA_DESCRIPTOR optionnel, escape XML
- Commande export-as-eaf + exportCurrentFileAsEaf() dans main.ts
- Bouton dans l'onglet Exports (visible format vtt/html uniquement)
- Clés i18n fr/en/es/ru
- extractWordData() : toutes les cues incluses (plus seulement celles avec
  timestamps), wordTimestampRate par cue ; fileSequentialityRate() ajouté
- 15 tests unitaires EafExporter (165 tests total, 0 échec)
2026-06-09 14:33:31 +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
a3204f1f76 release: v0.1.6 — corpus UI, exceptions, rename cascade, export destination 2026-05-17 13:59:35 +02:00
Axelle Abbadie
330c3258cb chore: bump to 0.1.6 2026-05-17 13:59:35 +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
364f392512 merge: corpus UI, exceptions, rename cascade, export destination 2026-05-17 12:42: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
561b43f8a9 release: v0.1.5 — noScribe import, scan candidats, exceptions 2026-05-17 02:04:10 +02:00
Axelle Abbadie
ef9ffc7a99 chore: bump to 0.1.5 2026-05-17 02:04:00 +02:00
Axelle Abbadie
63e475c762 docs: update changelog, README and ROADMAP for v0.1.5 dev 2026-05-17 01:43:53 +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
5a9e1f0581 docs: add noScribe integration & audio pseudonymization to Phase 10 roadmap
- VttParser with word-level timestamps and speaker diarization
- Timestamp adjustment UI with ±1s audio preview (Web Audio API)
- Audio bleep export (WAV, pseudonymized segments replaced by sine tone)
- Speaker-aware pseudonymization rules
2026-05-16 02:13:00 +02:00
Axelle Abbadie
3d4ead5a3b chore: bump to 0.1.4 2026-05-16 01:50:26 +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
411a8888e2 chore: bump to 0.1.3 2026-05-14 01:45:44 +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
991bc0f14f update README.md (minor) 2026-05-13 11:57:15 +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
48e9849389 chore: bump to 0.1.1 2026-05-13 11:26:15 +02:00
Axelle Abbadie
631803f8f4 feat: dictionaries tab — list, entry count, import, delete 2026-05-13 11:21:11 +02:00
Axelle Abbadie
446c867e17 fix: regenerate package-lock.json (concat-map 404 on CI) 2026-05-13 11:06:31 +02:00
Axelle Abbadie
0183c6d034 chore: v0.1.0 — minAppVersion 1.7.2, CSS border-bottom fix, versions.json 2026-05-13 10:58:19 +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
42bff2d6da fix version name in manifest & package to allow review on obs community tool 2026-05-13 02:10:29 +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
f6576afc4b chore: set version 0.1.0, minAppVersion 1.6.6 2026-05-13 01:54:50 +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
ccfb2c446d docs: ajout CHANGELOG.md — historique dev/prod 2026-05-12 23:47:18 +02:00
Axelle Abbadie
4a4f1a00e4 Maj mineure README & ROADMAP 2026-05-12 23:38:22 +02:00
Axelle Abbadie
ca9194deb6 docs: mise à jour README et ROADMAP pour v0.1.0
- README refactorisé : workflow, NER, surlignage, marqueurs, crédits
- ROADMAP : Phase 8 terminée, questions ouvertes #1/#3/#5/#10 tranchées
- i18n et Meld Encrypt ajoutés en Phase 10
2026-05-12 23:22:20 +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
0d19fef06a
Update settings.ts
fix for community plugins
2026-05-12 15:51:28 +02:00
Axelle Abbadie
2e1f9a1b0f chore: bump version to 0.0.3 — Obsidian plugin guidelines compliance 2026-05-12 11:15:29 +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
1b3ab838d6 chore: bump version to 0.0.2 2026-05-12 02:51:23 +02:00
Axelle Abbadie
b8640508e8 rename: pseudonymizer-tool (community plugins requirements) 2026-05-12 02:48:56 +02:00
Axelle Abbadie
9387abead1 release: v0.0.1 — description manifest en anglais pour community plugins 2026-05-12 02:22:41 +02:00
Axelle Abbadie
d216e81fb2 init 2026-05-12 01:55:27 +02:00