From d543fcdb974e6a93310e7950eb7ef56580de5d5a Mon Sep 17 00:00:00 2001 From: gabriele-cusato Date: Sun, 15 Mar 2026 13:25:50 +0100 Subject: [PATCH] primo commit, vedere claude.md per storico --- .claude/settings.local.json | 12 + .gitignore | 25 + CLAUDE.md | 242 ++++++++ HandTranscriptMd/.editorconfig | 10 + HandTranscriptMd/.github/workflows/lint.yml | 28 + HandTranscriptMd/.npmrc | 1 + HandTranscriptMd/AGENTS.md | 251 ++++++++ HandTranscriptMd/LICENSE | 5 + HandTranscriptMd/cloudDeploy.sh | 16 + HandTranscriptMd/deploy.sh | 16 + HandTranscriptMd/esbuild.config.mjs | 49 ++ HandTranscriptMd/eslint.config.mts | 34 ++ HandTranscriptMd/manifest.json | 9 + HandTranscriptMd/package-lock.json | 614 ++++++++++++++++++++ HandTranscriptMd/package.json | 23 + HandTranscriptMd/src/drawing-canvas.ts | 477 +++++++++++++++ HandTranscriptMd/src/embed.ts | 595 +++++++++++++++++++ HandTranscriptMd/src/main.ts | 52 ++ HandTranscriptMd/src/md-parser.ts | 55 ++ HandTranscriptMd/src/recognizer.ts | 88 +++ HandTranscriptMd/src/settings.ts | 228 ++++++++ HandTranscriptMd/src/svg-utils.ts | 124 ++++ HandTranscriptMd/styles.css | 259 +++++++++ HandTranscriptMd/tsconfig.json | 30 + HandTranscriptMd/version-bump.mjs | 17 + HandTranscriptMd/versions.json | 3 + README.md | 90 +++ 27 files changed, 3353 insertions(+) create mode 100644 .claude/settings.local.json create mode 100644 .gitignore create mode 100644 CLAUDE.md create mode 100644 HandTranscriptMd/.editorconfig create mode 100644 HandTranscriptMd/.github/workflows/lint.yml create mode 100644 HandTranscriptMd/.npmrc create mode 100644 HandTranscriptMd/AGENTS.md create mode 100644 HandTranscriptMd/LICENSE create mode 100644 HandTranscriptMd/cloudDeploy.sh create mode 100644 HandTranscriptMd/deploy.sh create mode 100644 HandTranscriptMd/esbuild.config.mjs create mode 100644 HandTranscriptMd/eslint.config.mts create mode 100644 HandTranscriptMd/manifest.json create mode 100644 HandTranscriptMd/package-lock.json create mode 100644 HandTranscriptMd/package.json create mode 100644 HandTranscriptMd/src/drawing-canvas.ts create mode 100644 HandTranscriptMd/src/embed.ts create mode 100644 HandTranscriptMd/src/main.ts create mode 100644 HandTranscriptMd/src/md-parser.ts create mode 100644 HandTranscriptMd/src/recognizer.ts create mode 100644 HandTranscriptMd/src/settings.ts create mode 100644 HandTranscriptMd/src/svg-utils.ts create mode 100644 HandTranscriptMd/styles.css create mode 100644 HandTranscriptMd/tsconfig.json create mode 100644 HandTranscriptMd/version-bump.mjs create mode 100644 HandTranscriptMd/versions.json create mode 100644 README.md diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..56e3762 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,12 @@ +{ + "permissions": { + "allow": [ + "WebSearch", + "Bash(cd \"C:/Projects/pluginObsidian/handWrittenMarkdownConverter/obsidian-sample-plugin\" && node esbuild.config.mjs production && bash cloudDeploy.sh)", + "WebFetch(domain:groups.google.com)", + "WebFetch(domain:css-tricks.com)", + "WebFetch(domain:chromium.googlesource.com)", + "WebFetch(domain:github.com)" + ] + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1bcc155 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# vscode +.vscode + +# Intellij +*.iml +.idea + +# npm +node_modules + +# Don't include the compiled main.js file in the repo. +# They should be uploaded to GitHub releases instead. +HandTranscriptMd/main.js + +# Exclude sourcemaps +*.map + +# obsidian +data.json + +# Exclude macOS Finder (System Explorer) View States +.DS_Store + +# Plugin di riferimento esterno (non fa parte di questo progetto) +obsidian_ink/ diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..c05c540 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,242 @@ +# Obsidian Handwriting Plugin — Contesto per Claude Code + +## Chi sono / Setup esistente + +- Sviluppatore IT con esperienza in C#, JavaScript, TypeScript, Python, SQL Server, VB6 +- Vault Obsidian organizzato: `Project/CLIENTI/NOME_CLIENTE/Progetto/` + - Sottocartella `_docs/` sincronizzata via **Google Drive** + - Struttura: `01_Riunioni/`, `02_Documentazione/`, `03_UI_Diagrammi/`, `DECISIONS.md`, `IDEAS.md`, `TODO.md` +- Su PC usa **Claude Code** che legge i file markdown direttamente +- Tablet Android con pennino (in valutazione acquisto) + +--- + +## Obiettivo: Plugin Obsidian "Handwriting to Markdown" + +### Cosa voglio + +Un plugin Obsidian che inserisce un **riquadro canvas inline** in un file `.md` dove posso: + +1. **Scrivere a mano con il pennino** (su tablet Android) +2. Il testo scritto viene **convertito automaticamente in markdown strutturato**: + - `# testo` → H1, `## testo` → H2, `### testo` → H3 + - `- testo` → lista, `1. testo` → lista numerata + - `- [ ] testo` → checkbox, `- [x]` → checkbox spuntata + - `> testo` → blockquote + - `` `testo` `` → codice inline, ` ```js ... ``` ` → blocco codice + - `==testo==` → highlight, `**testo**` → grassetto, `*testo*` → corsivo + - `~~testo~~` → barrato, `---` → separatore +3. Il risultato è **testo markdown puro** inserito nel file `.md` esistente +4. I disegni/schemi restano come immagine SVG linkati nel markdown +5. **Bidirezionale**: modificabile sia da tablet che da PC +6. **Nessun formato proprietario** — i file devono essere leggibili anche senza il plugin installato + +### Requisiti tecnici + +- Funziona su **Android** (Obsidian Mobile) e **Windows** +- Sync via **Google Drive** (già configurato) +- I file `.md` devono restare leggibili da **Claude Code** su PC +- Preferenza per soluzioni **senza dipendenze cloud** dove possibile + +--- + +## Stato attuale — Fase 2 COMPLETATA, Fase 3 IN CORSO (fix Android handwriting) + +### File del plugin (`HandTranscriptMd/src/`) + +| File | Cosa fa | +|------|---------| +| `main.ts` | Entry point: registra embed, comando "Insert handwriting block", ribbon icon, settings | +| `settings.ts` | Impostazioni: cartella SVG, dimensioni canvas, sfondo, lingue OCR, chiave API Gemini (campo password) | +| `drawing-canvas.ts` | Motore disegno Canvas API: Bézier quadratiche, penna, gomma parziale, undo/redo history-based, auto-expand, righe foglio | +| `svg-utils.ts` | Conversione tratti ↔ SVG (dati riedit in `` JSON), righe e sfondo inclusi nell'SVG | +| `embed.ts` | Code block processor, toolbar, bottone Converti collegato (OCR → markdown → sostituisce code block), `svgToBase64Png()` helper | +| `recognizer.ts` | `IRecognizer` interface + `GeminiRecognizer`: invia PNG base64 a Gemini API, restituisce testo | +| `md-parser.ts` | `parseMarkdown()`: post-processa testo OCR riga per riga applicando sintassi markdown | + +### Funzionalità implementate + +- **Canvas inline** nel markdown via code block `handwriting` +- **Disegno diretto** — click sul blocco = disegno immediato (no click "Edit") +- **Curve smooth** — Bézier quadratiche con tecnica midpoint +- **Gomma parziale** — cancella solo i punti toccati, taglia i tratti in segmenti +- **Undo/Redo** — basato su history di stati (funziona sia per disegno che per gomma) +- **Auto-expand** — il canvas si espande con animazione smooth (requestAnimationFrame, ease-out cubico) +- **Resize manuale** — handle trascinabile in basso +- **Clear → reset** alla dimensione di default con animazione +- **Righe orizzontali** — foglio a righe (32px), sia nel canvas che nell'SVG +- **Temi sfondo** — chiaro/scuro/custom con color picker nelle impostazioni +- **Remapping colori automatico** — i tratti si adattano al cambio tema (nero↔bianco, blu↔azzurro, ecc.) +- **Toolbar completa** — penna, gomma, 4 colori, undo, redo, clear, converti, salva, elimina (X) +- **Elimina riquadro** — bottone X rimuove code block dal .md e cancella SVG +- **Auto-save** — salvataggio debounced 2s dopo l'ultima modifica +- **SVG standard** — file `.svg` nella cartella `_handwriting/`, visibili da qualsiasi dispositivo +- **Palette colori adattiva** — colori scuri su sfondo chiaro, colori chiari su sfondo scuro +- **Resize handle tematizzato** — si adatta al tema scuro +- **OCR via Gemini** — bottone Converti: SVG → PNG base64 → Gemini 3.1 Flash Lite → testo → `md-parser` → sostituisce code block nel `.md` +- **Archiviazione SVG** — dopo la conversione, il file SVG viene spostato in `_handwriting/_converted/AAAA-MM-GG_HH-MM-SS.svg` +- **Settings OCR** — chiave API Gemini (campo password) + lingue OCR configurabili (default: `it, en`) +- **Supporto Android** — comportamenti differenziati tra Windows e Android: + - Toolbar compatta su mobile (▼/▲ toggle), espansa su Windows + - Icone SVG inline (mappa `ICONS` in `embed.ts`) — identiche su Windows e Android, nessuna dipendenza da `setIcon`/Lucide bundled — **RISOLTO** + - Disegno solo con penna (`pointerType === 'pen'`), dito ignorato su mobile per il disegno + - Focus fix multi-livello: `inputmode="none"` + listener `beforeinput` in capture phase + blur `.cm-editor` + `canvas.focus()` su pointerdown penna + - Cerchi colori: bottoni colore sono `
` (non `