From d51f8f54bace427ecd31c160c4b76e77334c37cc Mon Sep 17 00:00:00 2001 From: gabriele-cusato Date: Mon, 16 Mar 2026 00:03:31 +0100 Subject: [PATCH 01/14] =?UTF-8?q?verificato=20limite=20architetturale,=20a?= =?UTF-8?q?nche=20con=20svg,=20se=20scrivo=20nel=20canvas=20nel=20document?= =?UTF-8?q?o=20si=20attiva=20la=20modalit=C3=A0=20drawing=20e=20non=20vien?= =?UTF-8?q?e=20piu=20preso=20l'handwriting.=20Ormai=20le=20strade=20da=20p?= =?UTF-8?q?rovare=20su=20questo=20sono=20poche.=20Si=20potrebbe=20mettere?= =?UTF-8?q?=20uno=20switch,=20ovvero=20se=20io=20voglio=20handwriting,=20i?= =?UTF-8?q?=20riquadri=20non=20si=20vedono=20ma=20se=20ci=20clicco=20poi?= =?UTF-8?q?=20si=20apre=20la=20nuova=20scheda,=20altrimenti=20se=20non=20m?= =?UTF-8?q?i=20interessa=20posso=20avere=20la=20preview=20direttamente=20n?= =?UTF-8?q?el=20documento.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/settings.local.json | 3 +- CLAUDE.md | 269 +++-- .../Projects/handwriting-to-markdown/main.js | 16 + .../handwriting-to-markdown/manifest.json | 9 + .../Projects/handwriting-to-markdown/styles.css | 408 +++++++ HandTranscriptMd/cloudDeploy.sh | 8 +- HandTranscriptMd/deploy.sh | 6 +- HandTranscriptMd/src/drawing-canvas.ts | 55 +- HandTranscriptMd/src/editor-view.ts | 675 +++++++++++ HandTranscriptMd/src/embed.ts | 1001 ++++++++++------- HandTranscriptMd/src/main.ts | 20 +- HandTranscriptMd/styles.css | 214 ++++ 12 files changed, 2140 insertions(+), 544 deletions(-) create mode 100644 HandTranscriptMd/C/Users/gabri/Il mio Drive (gabrielecusato@gmail.com)/Projects/handwriting-to-markdown/main.js create mode 100644 HandTranscriptMd/C/Users/gabri/Il mio Drive (gabrielecusato@gmail.com)/Projects/handwriting-to-markdown/manifest.json create mode 100644 HandTranscriptMd/C/Users/gabri/Il mio Drive (gabrielecusato@gmail.com)/Projects/handwriting-to-markdown/styles.css create mode 100644 HandTranscriptMd/src/editor-view.ts diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 56e3762..7246c59 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -6,7 +6,8 @@ "WebFetch(domain:groups.google.com)", "WebFetch(domain:css-tricks.com)", "WebFetch(domain:chromium.googlesource.com)", - "WebFetch(domain:github.com)" + "WebFetch(domain:github.com)", + "WebFetch(domain:developer.chrome.com)" ] } } diff --git a/CLAUDE.md b/CLAUDE.md index c05c540..f7e05e4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -40,92 +40,126 @@ Un plugin Obsidian che inserisce un **riquadro canvas inline** in un file `.md` --- -## Stato attuale — Fase 2 COMPLETATA, Fase 3 IN CORSO (fix Android handwriting) +## Stato attuale — Fase 3 COMPLETATA (editor in tab separata) ### File del plugin (`HandTranscriptMd/src/`) | File | Cosa fa | |------|---------| -| `main.ts` | Entry point: registra embed, comando "Insert handwriting block", ribbon icon, settings | +| `main.ts` | Entry point: registra embed, editor view, comando, ribbon, settings, `previewCallbacks` per sync inline↔tab | | `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 | +| `drawing-canvas.ts` | Motore disegno Canvas API: Bézier quadratiche, penna, gomma parziale, undo/redo history-based, auto-expand, righe foglio, `allowFingerScroll()` | | `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 | +| `embed.ts` | Code block processor → preview SVG inline con 3 bottoni (X, converti, comprimi) in alto a sinistra + bottone portale in document.body; preview non cliccabile | +| `editor-view.ts` | `DrawingEditorView extends ItemView` — editor canvas in tab Obsidian dedicata, toolbar completa, scroll, auto-save | | `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 | +### Architettura attuale (Fase 3+) + +**Due formati supportati:** +- **NUOVO (default)**: `![[_handwriting/hw_xxx.svg]]` — SVG visibile nativamente anche senza plugin +- **LEGACY**: `` ```handwriting {"id":..., "svg":...}``` `` — vecchio formato, mantenuto per compatibilità + +**Preview inline — Nuovo formato wiki:** +- Obsidian renderizza `![[svg]]` come `[img][/img]` +- **MutationObserver su `document.body`** intercetta gli span con `src*="_handwriting/"` non appena appaiono nel DOM (funziona sia in reading view che in live preview dove il post-processor non viene chiamato) +- `tryDecorate()` con flag `data-hwm-decorated="1"` per evitare doppia elaborazione; ritenta dopo 150ms se la classe `image-embed` non è ancora presente (caricamento asincrono) +- **ZERO modifica al DOM dello span** — nessuna classe aggiunta, nessun figlio inserito, nessuno stile inline. Lo span resta identico a qualsiasi altra immagine Obsidian +- **Pannello portale** (`hwm_portal-panel`) in `document.body` con 4 bottoni: ✏️ (apre tab editor), 📄 (converti OCR), ↕️ (comprimi/espandi), ✕ (elimina). Posizionato via RAF + `getBoundingClientRect()` + `position: fixed` +- **Refresh immagine**: `previewCallbacks.set(embedId, ...)` aggiorna `img.src` con cache-bust `?t=timestamp` dopo ogni salvataggio dalla tab editor (Obsidian non aggiorna automaticamente `![[svg]]` in live preview quando il file cambia) +- **NO data-URI**: il src dell'img resta sempre l'URL vault (`http://localhost/_capacitor_file_/...`) — un data-URI verrebbe interpretato da Android come drawing surface + +**Preview inline — Formato legacy:** +- Mostra l'SVG come CSS `background-image` su un `
` (no ``) +- 3 bottoni inline (`
`, non `