Skip to content

feat(typography): smart quotes automatici via remark-smartypants - #4

Merged
marcofarina merged 2 commits into
mainfrom
feat/smart-quotes
Jun 3, 2026
Merged

feat(typography): smart quotes automatici via remark-smartypants#4
marcofarina merged 2 commits into
mainfrom
feat/smart-quotes

Conversation

@marcofarina

@marcofarina marcofarina commented Jun 3, 2026

Copy link
Copy Markdown
Owner

Cosa

Abilita gli smart quotes (virgolette tipografiche curve) sull'intero sito: gli apici dritti scritti nel sorgente vengono convertiti in "…" '…' e apostrofo '. La prosa è gestita a build-time; titoli, navbar e meta sono curvati alla fonte.

Risolve il task 🟠 di v0.3.0 — "House in Order".

Prosa: conversione a build-time

remark-smartypants su docs preset, blog e i 4 volumi converte gli apici della prosa mentre Docusaurus genera l'HTML.

  • Sorgente resta ASCII → comodo da scrivere, diff puliti.
  • Permanente per costruzione: avviene a ogni build, niente da far regredire → nessuna regola Prettier né script di migrazione (la roadmap ipotizzava Prettier, ma Prettier non tocca la tipografia della prosa).
  • Lavora sull'AST: salta automaticamente blocchi di codice, inline code e attributi JSX.

Dettagli:

  • Config async: remark-smartypants è ESM-only → config async con import() dinamico.
  • Guard <InlineCode> (plugins/smartypants-guard.js): <InlineCode> rende un <code> ma riceve il codice come children testuali (prosa per smartypants). Senza protezione <InlineCode kind="string">"Hello"</InlineCode> diventerebbe "Hello" (curvo) dentro codice. protectCode/restoreCode avvolgono smartypants e proteggono questi children. Estendibile via CODE_COMPONENTS.

Titoli / navbar / meta: carattere curvo alla fonte

<title>, meta OG e label navbar non passano dalla pipeline remark (le stringhe del config non sono Markdown; il <title> deriva dall'H1 grezzo, letto prima di smartypants). Essendo testo di display puro — mai codice — la soluzione corretta è scrivere ' (U+2019) direttamente nel sorgente: titolo sito, navbar, footer, alt logo nel config + i 3 H1 dei volumi. Curvare l'H1 sistema sia il corpo (smartypants è idempotente) sia il <title> derivato.

Verifica sul build

  • Prosa / H1: apici curvi ✅
  • Codice e <InlineCode kind="string">: apici dritti ✅ (0 falsi positivi dentro <code>)
  • <title>, og:title, navbar: apostrofo curvo ✅ (es. Python Doesn't Byte, Manuale dell'Artefice | Python Doesn't Byte)
  • npm run typecheck ✅ · npm run build ✅ · lint dei file toccati ✅

🤖 Generated with Claude Code

marcofarina and others added 2 commits June 3, 2026 02:07
Converte a build-time gli apici dritti della prosa in virgolette curve
tipografiche ("…" '…' e apostrofo ') su tutti i volumi, docs preset e
blog. Lavora sull'AST: blocchi di codice, inline code e attributi JSX
restano intatti, quindi il sorgente resta ASCII (comodo da scrivere) e
la conversione è permanente per costruzione — niente migrazione né
regole Prettier.

Il config diventa async per caricare remark-smartypants (ESM-only) con
import() dinamico. protectCode/restoreCode (plugins/smartypants-guard.js)
proteggono i children di <InlineCode>, che renderizza codice via testo e
non va smart-quotato.

Verificato sul build: H1/prosa con apici curvi, codice e <InlineCode
kind="string"> con apici dritti (0 falsi positivi). Limite noto:
title/meta/navbar derivano dal config/frontmatter e restano dritti
(non passano dalla pipeline remark).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
I titoli non passano dalla pipeline remark: le stringhe del config
(titolo sito, navbar, footer, alt logo) non sono Markdown, e il
<title>/meta delle pagine deriva dall'H1 grezzo letto prima di
smartypants. Essendo testo di display puro (mai codice), il modo
corretto è scrivere il carattere curvo U+2019 direttamente nel
sorgente: rende curvo ovunque (tab, anteprima social, navbar, sidebar)
a costo zero. Curvare l'H1 sistema sia il corpo (smartypants è
idempotente) sia il <title> derivato.

Verificato sul build: <title>, og:title e navbar tutti con apostrofo
curvo. Chiude il "limite noto" della PR.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@marcofarina
marcofarina merged commit 8baed67 into main Jun 3, 2026
1 check passed
@marcofarina
marcofarina deleted the feat/smart-quotes branch June 3, 2026 00:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant