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" }