discourse-to-markdown è un nuovo plugin che restituisce il contenuto del forum in formato Markdown quando il client invia Accept: text/markdown o aggiunge .md a qualsiasi URL di contenuto.
Lo stiamo utilizzando sul nostro forum all’indirizzo https://discourse.roots.io:
curl -H "Accept: text/markdown" https://discourse.roots.io/latest
curl https://discourse.roots.io/t/serve-your-wordpress-posts-as-markdown/30321.md
L’HTML è costoso da elaborare per un LLM, e fornire Markdown contenente solo il testo spesso riduce l’utilizzo dei token da 3 a 5 volte. Ciò significa chiamate API più economiche, risposte più rapide e più spazio nella finestra del contesto per il ragionamento del modello. Consulta https://acceptmarkdown.com per una spiegazione più dettagliata e un controllo di compatibilità per qualsiasi sito.
Come i client richiedono il Markdown
Tre punti di accesso:
- Intestazione
Accept: text/markdown(ideale per gli LLM) - Suffisso URL
.md - Scoperta (ogni risposta HTML annuncia il proprio fratello Markdown tramite
Link: <...>; rel="alternate"; type="text/markdown"e un tag<link rel="alternate">nell’<head>, i feed RSS includono un<atom:link>che punta all’equivalente Markdown)
Route supportate
| Route | HTML | Markdown |
|---|---|---|
| Argomento | /t/:slug/:id |
/t/:slug/:id.md |
| Singolo post | /t/:slug/:id/:post_number |
/t/:slug/:id/:post_number.md |
| Categoria | /c/:slug/:id |
/c/:slug/:id.md |
| Tag | /tag/:tag |
/tag/:tag.md |
| Ultime | /latest |
/latest.md |
| Top | /top |
/top.md |
| Caldi | /hot |
/hot.md |
| Attività utente | /u/:username/activity |
/u/:username/activity.md |
Installazione
Aggiungi il plugin al tuo file app.yml:
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/roots/discourse-to-markdown.git
Ricostruisci il contenitore:
cd /var/discourse
./launcher rebuild app
Quindi abilitalo in Admin → Impostazioni → Plugin → Output Markdown.
Note sulla conversione
Il plugin converte l’HTML cooked di Discourse — la rappresentazione renderizzata che i lettori vedono, con onebox espansi, menzioni collegate e citazioni attribuite — non raw. Questo preserva ciò che i lettori vedono effettivamente e mantiene l’output portabile su qualsiasi renderer compatibile con GFM. Le strutture specifiche di Discourse (citazioni, onebox, dettagli, menzioni, hashtag, emoji, lightbox, sondaggi) vengono riscritte in modo coerente prima della conversione.
Il Markdown convertito viene memorizzato nella cache di Redis per ogni post, indicizzato su post.id + post.updated_at, e le modifiche invalidano automaticamente la cache.
Impostazioni
| Impostazione | Predefinito | Scopo |
|---|---|---|
discourse_to_markdown_enabled |
false |
Interruttore principale per il plugin |
discourse_to_markdown_md_urls_enabled |
true |
Accetta i suffissi URL .md come fratello della route HTML |
discourse_to_markdown_strict_accept |
false |
Restituisce 406 Not Acceptable quando l’intestazione Accept del client esclude sia text/html che text/markdown |
discourse_to_markdown_emit_vary |
true |
Invia Vary: Accept nelle risposte Markdown e 406 affinché le cache non servano rappresentazioni incrociate |
discourse_to_markdown_include_post_metadata |
true |
Include URL, categoria, tag, autore e timestamp nella rappresentazione Markdown |
Risorse
- Sorgente/issue: GitHub - roots/discourse-to-markdown: Serve Discourse content as Markdown via Accept: text/markdown or .md URLs — content negotiation for LLMs and agents. · GitHub
- acceptmarkdown.com — servizio di Markdown per agenti tramite negoziazione dei contenuti, più un controllo di compatibilità per il tuo sito
- RFC 9110 §12.5.1 — Negoziazione proattiva — la specifica implementata da questo plugin
- RFC 7763 — registrazione del tipo di media
text/markdown - MDN — Negoziazione dei contenuti — introduzione accessibile al concetto
- Consulta acceptmarkdown.com/reference per la specifica completa e l’elenco della documentazione per sviluppatori