Skip to content

Come funziona Markdown

Capire come funziona Markdown ti aiuta a sfruttare meglio questo potente strumento. In questo capitolo scoprirai come il testo semplice viene trasformato in un documento ben formattato.

Flusso di lavoro di base

Il flusso di lavoro di Markdown può essere riassunto nei seguenti passaggi:

File sorgente Markdown (.md) → Parser Markdown → Documento HTML → Rendering nel browser

1. Scrivere il file sorgente Markdown

Puoi utilizzare qualsiasi editor di testo per creare un file .md e scrivere contenuti usando la sintassi Markdown:

markdown
# Il mio documento

Questo è un paragrafo **importante**.

## Esempio di lista

- Elemento 1
- Elemento 2
- Elemento 3

2. Elaborazione tramite il parser Markdown

Il parser legge il file Markdown, riconosce gli elementi sintattici e li converte nel corrispondente HTML:

html
<h1>Il mio documento</h1>
<p>Questo è un <strong>importante</strong> paragrafo.</p>
<h2>Esempio di lista</h2>
<ul>
  <li>Elemento 1</li>
  <li>Elemento 2</li>
  <li>Elemento 3</li>
</ul>

3. Rendering nel browser

L'HTML generato viene visualizzato come documento formattato nel browser.

Come funzionano i parser

Analisi lessicale

Il parser esegue prima un'analisi lessicale, suddividendo il testo Markdown in token:

  • # riconosciuto come token di intestazione
  • **testo** come token grassetto
  • - elemento come token di elemento di lista

Analisi sintattica

Successivamente viene eseguita l'analisi sintattica per costruire un albero sintattico astratto (AST):

Documento
├── Intestazione (livello 1): "Il mio documento"
├── Paragrafo
│   ├── Testo: "Questo è un"
│   ├── Grassetto: "importante"
│   └── Testo: "paragrafo."
├── Intestazione (livello 2): "Esempio di lista"
└── Lista non ordinata
    ├── Elemento: "Elemento 1"
    ├── Elemento: "Elemento 2"
    └── Elemento: "Elemento 3"

Generazione HTML

Infine, l'albero sintattico viene attraversato per generare il corrispondente output HTML.

Parser più diffusi

CommonMark

  • Specifiche standard – Fornisce uno standard unificato per il parsing Markdown
  • Definizione rigorosa – Elimina ambiguità tra implementazioni
  • Ampio supporto – Adottato da molti parser

GitHub Flavored Markdown (GFM)

Basato su CommonMark, con estensioni:

  • Supporto tabelle
  • Barrato
  • Liste di attività
  • Riconoscimento autolink
  • Evidenziazione della sintassi nei blocchi di codice

Altri parser

ParserLinguaggioCaratteristiche
markedJavaScriptVeloce, leggero
markdown-itJavaScriptEstendibile, molti plugin
Python-MarkdownPythonRicco di funzionalità, sistema di plugin
kramdownRubySupporta più formati di output
PandocHaskellConvertitore universale di documenti

Motori di rendering

Rendering lato client

Il Markdown viene analizzato nel browser in tempo reale:

javascript
// Con marked.js
const html = marked.parse('# Ciao mondo');
document.body.innerHTML = html;

Vantaggi:

  • Nessuna elaborazione lato server necessaria
  • Anteprima in tempo reale
  • Riduce il carico sul server

Svantaggi:

  • Dipende da JavaScript
  • Non ottimale per SEO
  • Caricamento iniziale più lento

Rendering lato server

L'HTML viene generato preventivamente sul server:

javascript
// Esempio Node.js
const fs = require('fs');
const marked = require('marked');

const markdown = fs.readFileSync('documento.md', 'utf8');
const html = marked.parse(markdown);

Vantaggi:

  • Ottimale per SEO
  • Caricamento veloce
  • Nessuna dipendenza da JavaScript lato client

Svantaggi:

  • Carico sul server
  • Gestione cache complessa

Generazione di siti statici

Tutte le pagine vengono generate in anticipo durante la build:

bash
# Con VitePress
npm run build

Vantaggi:

  • Velocità di caricamento massima
  • Migliore SEO
  • Elevata sicurezza
  • Distribuzione semplice

Svantaggi:

  • Supporto limitato per contenuti dinamici
  • Tempi di build più lunghi

Meccanismi di estensione

Sistema di plugin

Molti parser supportano estensioni tramite plugin:

javascript
// Esempio di plugin markdown-it
const md = require('markdown-it')()
  .use(require('markdown-it-footnote'))
  .use(require('markdown-it-deflist'))
  .use(require('markdown-it-abbr'));

Renderer personalizzato

javascript
// Renderer personalizzato per i link
const renderer = new marked.Renderer();
renderer.link = function(href, title, text) {
  return `<a href="${href}" target="_blank">${text}</a>`;
};

Ottimizzazione delle prestazioni

Strategia di caching

javascript
const cache = new Map();

function parseMarkdown(content) {
  const hash = generateHash(content);
  if (cache.has(hash)) {
    return cache.get(hash);
  }
  
  const result = marked.parse(content);
  cache.set(hash, result);
  return result;
}

Lazy Loading

javascript
// Analizza solo l'area visibile
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      parseAndRender(entry.target);
    }
  });
});

Elaborazione in streaming

javascript
// Parsing a flusso per file di grandi dimensioni
const fs = require('fs');
const { Transform } = require('stream');

const markdownTransform = new Transform({
  transform(chunk, encoding, callback) {
    const html = marked.parse(chunk.toString());
    callback(null, html);
  }
});

fs.createReadStream('documento-grande.md')
  .pipe(markdownTransform)
  .pipe(fs.createWriteStream('output.html'));

Problemi comuni

1. Problemi di interruzione di riga

Parser diversi possono gestire le interruzioni di riga in modo differente:

markdown
Riga 1
Riga 2        ← Potrebbero essere interpretate come lo stesso paragrafo

Riga 1  
Riga 2        ← Due spazi alla fine della riga forzano un'interruzione di riga

Riga 1

Riga 2        ← Una riga vuota separa i paragrafi

2. Mescolanza di HTML

markdown
Questo è un mix di **Markdown** e <em>HTML</em>.

Fai attenzione a chiudere e annidare correttamente i tag HTML.

3. Escape dei caratteri speciali

markdown
Qui devi fare l'escape di \* e \_ .

Scenari di applicazione pratica

1. Sistemi di blog

Articoli Markdown → Generatore di siti statici → Sito web HTML

2. Siti di documentazione

Documenti .md → VitePress/Docusaurus → Documentazione online

3. File README

README.md → GitHub/GitLab → Homepage del progetto

4. App per prendere appunti

Note Markdown → Rendering in tempo reale → Visualizzazione rich text

Prossimi passi

Ora che sai come funziona Markdown, puoi:

Built by www.markdownlang.com