diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index fbed6ee..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "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)", - "WebFetch(domain:developer.chrome.com)", - "Bash(\"C:\\\\Program Files\\\\Git\\\\bin\\\\bash.exe\" --login -c \"cd 'C:/Projects/pluginObsidian/handWrittenMarkdownConverter/HandTranscriptMd' && bash deploy.sh && bash cloudDeploy.sh\" 2>&1)", - "Bash(\"C:\\\\Program Files\\\\Git\\\\bin\\\\bash.exe\" --login -c \"cd 'C:/Projects/pluginObsidian/handWrittenMarkdownConverter/HandTranscriptMd' && bash deploy.sh\" 2>&1)" - ] - } -} diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 9867243..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,235 +0,0 @@ -# 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 6 (pannello portale inline + bgMode live update + fix CSS tema) — TESTATO - -### File del plugin (`HandTranscriptMd/src/`) - -| File | Cosa fa | -|------|---------| -| `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, toggle `hwmHandwritingMode`; mostra versione (`plugin.manifest.version`) e branch (`PLUGIN_BRANCH` costante hardcoded) nell'header della pagina impostazioni | -| `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 → preview SVG inline + pannello portale (figlio dello span, position:absolute); click matita → Modal (Windows) o nuova tab (Android); badge mode; `onBgModeRemap` per aggiornare SVG al cambio tema | -| `editor-view.ts` | `DrawingEditorView` (tab dedicata, Android) + `DrawingModal` (overlay fullscreen, Windows), toolbar completa, 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) -- **Classe badge mode**: `span.classList.toggle('hwm-badge-mode', hwmHandwritingMode)` — unica modifica allo span quando lo switch è attivo -- **Pannello portale** (`hwm_portal-panel`) con 4 bottoni: ✏️ (apre Modal su Windows / tab su Android), 📄 (converti OCR), ↕️ (comprimi/espandi), ✕ (elimina). - - **Posizione**: `container.appendChild(panel)` — il pannello è un figlio diretto dello span; `position: absolute; top: 6px; right: 6px` ancorato allo span (che ha `position: relative`). Non più in `document.body`. - - **Nessun RAF loop**: eliminato il loop `requestAnimationFrame` e il listener `scroll`. Il pannello segue lo span naturalmente nel DOM. - - **Cleanup**: `plugin.register(() => panel.remove())` — il pannello viene rimosso quando il plugin viene disabilitato. - - **Click dei bottoni**: lo span ha `pointer-events: none` (per handwriting Android); il pannello ha `pointer-events: auto` in CSS per ripristinare i click. - - **Nascondere con modal aperto**: Desktop → `panel.style.display = 'none'` nel click handler, ripristinato nel callback `modal.onClosed`; Mobile → `workspace.on('layout-change', ...)` per rilevare apertura/chiusura tab. -- **Comprimi/Espandi**: usa `container.style.height + overflow: hidden` sullo span contenitore — modifica solo l'altezza visibile senza toccare la larghezza dell'immagine. -- **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 `