diff --git a/LICENSE b/LICENSE
index b2640bf..9742642 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,18 +1,16 @@
------------------------------------------------------------------------------
-Code source — The Beerware License (Revision 42)
------------------------------------------------------------------------------
+Creative Commons Attribution 4.0 International (CC BY 4.0)
-Axelle Abbadie a écrit ce logiciel.
-Vous pouvez faire ce que vous voulez avec, tant que vous conservez cette notice.
-Si on se croise un jour et que vous pensez que ça valait le coup,
-vous pouvez m'offrir une bière.
+Copyright (c) 2026 Axelle Abbadie
+https://cv.hal.science/axelle-abbadie/
------------------------------------------------------------------------------
-Documentation (SPECS.md, ROADMAP.md, README.md) — CC BY 4.0
------------------------------------------------------------------------------
+This work is licensed under the Creative Commons Attribution 4.0 International License.
-Creative Commons Attribution 4.0 International
-https://creativecommons.org/licenses/by/4.0/
+You are free to:
+ Share — copy and redistribute the material in any medium or format
+ Adapt — remix, transform, and build upon the material for any purpose, even commercially
-Vous êtes libres de partager et d'adapter ces documents, y compris à des fins
-commerciales, à condition de créditer la source (Axelle Abbadie, PseudObsidian-ization).
+Under the following terms:
+ Attribution — You must give appropriate credit, provide a link to the license,
+ and indicate if changes were made.
+
+Full license: https://creativecommons.org/licenses/by/4.0/legalcode
diff --git a/esbuild.config.mjs b/esbuild.config.mjs
index b149e80..a3bd444 100644
--- a/esbuild.config.mjs
+++ b/esbuild.config.mjs
@@ -1,6 +1,6 @@
import esbuild from "esbuild";
import process from "process";
-import builtins from "builtin-modules";
+import { builtinModules as builtins } from "module";
const prod = process.argv[2] === "production";
diff --git a/main.js b/main.js
index 92041a0..cce41a4 100644
--- a/main.js
+++ b/main.js
@@ -446,7 +446,7 @@ var QuickPseudonymizeModal = class extends import_obsidian3.Modal {
new import_obsidian3.Setting(contentEl).addButton(
(btn) => btn.setButtonText("Pseudonymiser").setCta().onClick(() => this.apply())
);
- setTimeout(() => replacementInput == null ? void 0 : replacementInput.focus(), 50);
+ window.setTimeout(() => replacementInput == null ? void 0 : replacementInput.focus(), 50);
}
async apply() {
const replacement = this.replacement.trim();
@@ -763,8 +763,6 @@ var OccurrencesModal = class extends import_obsidian5.Modal {
}
}
buildCard(container, occ, rule) {
- var _a;
- const decision = (_a = this.decisions.get(occ.id)) != null ? _a : "validated";
const card = container.createDiv();
card.addClass("pseudobs-occ-card");
const srcLine = card.createDiv();
@@ -1197,7 +1195,7 @@ var PseudObsPlugin = class extends import_obsidian7.Plugin {
return;
if (!CONVERTIBLE_EXTS.includes(file.extension.toLowerCase()))
return;
- setTimeout(() => {
+ window.setTimeout(() => {
void this.autoConvert(file);
}, 300);
})
@@ -1347,7 +1345,7 @@ var PseudObsPlugin = class extends import_obsidian7.Plugin {
const store = new MappingStore({ type: "file", path: mdPath });
await this.app.vault.create(mappingPath, JSON.stringify(store.toJSON(), null, 2));
}
- await this.app.vault.delete(file);
+ await this.app.fileManager.trashFile(file);
const mdFile = this.app.vault.getAbstractFileByPath(mdPath);
if (mdFile instanceof import_obsidian7.TFile) {
await this.app.workspace.getLeaf().openFile(mdFile);
@@ -1359,12 +1357,12 @@ var PseudObsPlugin = class extends import_obsidian7.Plugin {
}
// --- Commande "Ajouter une transcription" ---
openFilePicker() {
- const input = document.createElement("input");
+ const input = activeDocument.createElement("input");
input.type = "file";
input.accept = ".srt,.cha,.chat,.txt,.md";
input.multiple = true;
input.classList.add("pseudobs-hidden-input");
- document.body.appendChild(input);
+ activeDocument.body.appendChild(input);
input.addEventListener("change", () => {
void this.processFilePicker(input);
});
diff --git a/manifest.json b/manifest.json
index df869a8..f8a9b29 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,7 +1,7 @@
{
"id": "pseudonymizer-tool",
"name": "Pseudonymizer Tool",
- "version": "0.0.4",
+ "version": "0.0.5",
"minAppVersion": "1.4.0",
"description": "Pseudonymize and correct interactional transcripts (Jefferson, ICOR, SRT, CHAT/CHA). Designed for qualitative researchers in linguistics and conversation analysis.",
"author": "Axelle Abbadie",
diff --git a/package.json b/package.json
index dbc4080..103f46f 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "pseudonymizer-tool",
- "version": "0.0.4",
+ "version": "0.0.5",
"description": "Plugin Obsidian de pseudonymisation de transcriptions",
"author": "Axelle Abbadie",
"homepage": "https://cv.hal.science/axelle-abbadie/",
@@ -17,7 +17,8 @@
"@types/node": "^18.0.0",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",
- "builtin-modules": "^3.3.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
"esbuild": "^0.20.0",
"eslint": "^8.57.0",
"eslint-plugin-obsidianmd": "^0.2.9",
diff --git a/src/main.ts b/src/main.ts
index 3655726..2d9e370 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -15,7 +15,7 @@ import { ScopeResolver } from './mappings/ScopeResolver';
import { PseudonymizationEngine } from './pseudonymizer/PseudonymizationEngine';
import { findSpansForRule } from './pseudonymizer/ReplacementPlanner';
import { applySpans } from './pseudonymizer/SpanProtector';
-import type { MappingFile, MappingRule, MappingStatus, Occurrence } from './types';
+import type { MappingRule, MappingStatus, Occurrence } from './types';
const CONVERTIBLE_EXTS = ['srt', 'cha', 'chat'];
@@ -49,7 +49,7 @@ export default class PseudObsPlugin extends Plugin {
if (!(file instanceof TFile)) return;
if (!CONVERTIBLE_EXTS.includes(file.extension.toLowerCase())) return;
// Délai court pour laisser Obsidian finir l'écriture du fichier
- setTimeout(() => { void this.autoConvert(file); }, 300);
+ window.setTimeout(() => { void this.autoConvert(file); }, 300);
})
);
@@ -239,7 +239,7 @@ export default class PseudObsPlugin extends Plugin {
}
// Supprimer le fichier source non-Markdown maintenant remplacé par le .md
- await this.app.vault.delete(file);
+ await this.app.fileManager.trashFile(file);
// Ouvrir le .md
const mdFile = this.app.vault.getAbstractFileByPath(mdPath);
@@ -256,13 +256,13 @@ export default class PseudObsPlugin extends Plugin {
// --- Commande "Ajouter une transcription" ---
private openFilePicker(): void {
- const input = document.createElement('input');
+ const input = activeDocument.createElement('input');
input.type = 'file';
input.accept = '.srt,.cha,.chat,.txt,.md';
input.multiple = true;
// Pas de display:none — bloque le change event dans certaines versions d'Electron
input.classList.add('pseudobs-hidden-input');
- document.body.appendChild(input);
+ activeDocument.body.appendChild(input);
input.addEventListener('change', () => { void this.processFilePicker(input); });
diff --git a/src/ui/EditRuleModal.ts b/src/ui/EditRuleModal.ts
index 1245293..d3d8656 100644
--- a/src/ui/EditRuleModal.ts
+++ b/src/ui/EditRuleModal.ts
@@ -1,6 +1,6 @@
import { App, Modal, Notice, Setting } from 'obsidian';
import type PseudObsPlugin from '../main';
-import type { EntityCategory, MappingRule, ScopeType } from '../types';
+import type { EntityCategory, ScopeType } from '../types';
import type { RuleLocation } from '../mappings/ScopeResolver';
export class EditRuleModal extends Modal {
diff --git a/src/ui/OccurrencesModal.ts b/src/ui/OccurrencesModal.ts
index fd21bd0..3888e54 100644
--- a/src/ui/OccurrencesModal.ts
+++ b/src/ui/OccurrencesModal.ts
@@ -1,6 +1,6 @@
import { App, Modal, Notice, Setting, TFile } from 'obsidian';
import type PseudObsPlugin from '../main';
-import type { MappingRule, Occurrence, MappingStatus } from '../types';
+import type { MappingRule, Occurrence } from '../types';
import { resolveSpans, applySpans } from '../pseudonymizer/SpanProtector';
import type { ReplacementSpan } from '../types';
@@ -120,8 +120,6 @@ export class OccurrencesModal extends Modal {
}
private buildCard(container: HTMLElement, occ: Occurrence, rule: MappingRule): void {
- const decision = this.decisions.get(occ.id) ?? 'validated';
-
const card = container.createDiv();
card.addClass('pseudobs-occ-card');
diff --git a/src/ui/QuickPseudonymizeModal.ts b/src/ui/QuickPseudonymizeModal.ts
index d6b0149..daee9cb 100644
--- a/src/ui/QuickPseudonymizeModal.ts
+++ b/src/ui/QuickPseudonymizeModal.ts
@@ -1,7 +1,6 @@
import { App, Editor, EditorPosition, Modal, Notice, Setting, TFile } from 'obsidian';
import type PseudObsPlugin from '../main';
import { MappingStore } from '../mappings/MappingStore';
-import { PseudonymizationEngine } from '../pseudonymizer/PseudonymizationEngine';
import type { EntityCategory, MappingFile } from '../types';
type ApplyScope = 'occurrence' | 'file';
@@ -124,7 +123,7 @@ export class QuickPseudonymizeModal extends Modal {
);
// Focus sur le champ de remplacement à l'ouverture
- setTimeout(() => replacementInput?.focus(), 50);
+ window.setTimeout(() => replacementInput?.focus(), 50);
}
private async apply(): Promise {
diff --git a/versions.json b/versions.json
index 6d12804..33744e9 100644
--- a/versions.json
+++ b/versions.json
@@ -2,5 +2,6 @@
"0.0.1": "1.4.0",
"0.0.2": "1.4.0",
"0.0.3": "1.4.0",
- "0.0.4": "1.4.0"
+ "0.0.4": "1.4.0",
+ "0.0.5": "1.4.0"
}