Il core di Discourse ora include endpoint Markdown per le liste e le visualizzazioni dei topic

Discourse supporta ora gli endpoint Markdown nativi, rendendo più semplice per gli strumenti di IA e altri client leggere i contenuti del forum senza dover analizzare intere pagine HTML.

Questa funzionalità sarà abilitata per impostazione predefinita su tutti i siti ospitati tramite il sistema “Modifiche in arrivo”. Gli amministratori che desiderano disattivarla possono farlo disabilitando la modifica in arrivo enable_markdown_endpoints in /admin/config/upcoming-changes?changeNamesFilter=enable_markdown_endpoints:

Un grande ringraziamento a @benword per aver creato l’originale plugin Discourse to Markdown, che è stato il precursore di questa funzionalità nel nucleo di Discourse.


L’output Markdown viene generato dall’HTML renderizzato (“cotto”) dei post, preservando i contenuti visualizzati dai lettori, inclusi i link espansi e la formattazione elaborata. Gli elementi specifici di Discourse come citazioni, onebox, blocchi di codice, sondaggi e sezioni comprimibili vengono riconvertiti in Markdown. Le risposte ai topic includono metadati e link di paginazione, e i corpi dei post convertiti vengono memorizzati nella cache utilizzando un digest dei contenuti in modo che le modifiche producano un output aggiornato.

I client possono richiedere esplicitamente il Markdown tramite URL .md o inviando un header Accept: text/markdown. La negoziazione rispetta i valori di qualità e seleziona il Markdown quando è preferito rispetto a HTML e JSON; le richieste esplicite .md mantengono i loro formati. Le pagine HTML supportate pubblicizzano il loro equivalente Markdown tramite un header HTTP Link e un elemento <link rel="alternate">.

24 Mi Piace

Vuoi che elenchi quali liste di argomenti sono supportate e quali no?

Poiché sto attualmente utilizzando il plugin originale Discourse-to-Markdown, devo disattivarlo e rimuoverlo per evitare output in conflitto? Vi prego di consigliarmi.

Funziona bene senza il plugin e con la funzione in arrivo abilitata.

1 Mi Piace

Una domanda: per chi utilizza il proxy di Cloudflare, sembra esserci un conflitto tra la funzione del core e il loro strumento di conversione. La domanda è: se mi trovo dietro il proxy, dato che la funzione è riservata agli abbonati, impediranno la conversione dell’header da HTML a .md, oppure, poiché il client supporta la conversione, questa avviene indipendentemente da ciò?

Sì. Se il plugin rimane abilitato, sostituisce alcuni degli endpoint principali, quindi consigliamo di disattivarlo/rimuoverlo per utilizzare la funzionalità ora presente nel core.

Attualmente, i seguenti:

Supportati Esempi
Elenco principale /latest.md, /hot.md, /top.md
Elenco personalizzato, richiede autenticazione /new.md, /unread.md
Elenco predefinito di categoria/sottocategoria /c/support/6.md, /c/parent/child/12.md
Elenco con tag singolo /tag/example.md, /tag/example/123.md

/categories.md e /tags.md sono inoltre supportati come directory. Definizioni delle route

Non sono molto familiare con la funzione di Cloudflare, ma da ciò che posso capire, intercetta la richiesta Accept text/markdown prima che raggiunga il server, converte l’html e poi la serve. Quindi, sembra che quella funzione sovrascriverebbe quella di Discourse, se/quando si utilizza Cloudflare.

3 Mi Piace

Sarebbe sovrascritto se abilitato, giusto? Non ho trovato sul loro blog alcuna informazione su se impediscono all’origine stessa di impostare questo header.

Non lo so con certezza, ma l’opzione più semplice è testare su un sito live e confrontare l’output con quello che restituisce meta. Ci saranno differenze nel contenuto incluso. Se la risposta che ottieni è la stessa con o senza la funzione di Cloudflare, allora sta rispettando il Markdown restituito da Discourse core.

1 Mi Piace

Grazie per l’indicazione, ecco la risposta in merito:

  • X-Discourse-Route: topics/show: Mostra il controller/action interno di Discourse (Ruby on Rails) che sta elaborando il topic.
  • X-Runtime: 0.133969: Tempo impiegato dall’applicazione per generare la risposta (circa ~133ms).
  • Cf-Ray: ...-GRU: Richiesta gestita dall’edge di Cloudflare a Guarulhos/São Paulo (GRU).
  • Cf-Cache-Status: DYNAMIC e Cache-Control: no-cache, no-store: Contenuto dinamico che non viene memorizzato nella cache di bordo.
  • Ispezionando l’URL HTML comune senza .json, il server risponde con:
    • Link: <https://segredin.com/t/conselhos-duvidosos/22054.md>; rel="alternate"; type="text/markdown"
    • X-Discourse-Crawler-View: true (indica che Discourse mette a disposizione anche una versione pulita in .md / Markdown nativo per crawler e lettori).

L’header Link che indica la versione alternativa: Link: <https://segredin.com/t/conselhos-duvidosos/22054.md>; rel="alternate"; type="text/markdown"

Restituisce Vary: Accept dall’origine indipendentemente dalle funzioni esterne a livello di DNS.

Se la richiesta viene effettuata senza il suffisso .json, verrà restituito il .md come conversione predefinita.

HTTP/1.1 200 OK
Content-Type: text/markdown
Vary: Accept

Ho avuto dei dubbi perché ho ricevuto 123.000 richieste da Claude e la maggior parte, da quando ho aggiornato Discourse con questa funzione del core, non è aumentata in modo vertiginoso. Continuerò a monitorare la situazione nelle prossime settimane.

Grazie, ero confuso perché ho provato prima su un elenco di argomenti filtrato per categoria e tag e non ha funzionato. Tendo a scegliere esempi poco adatti per i test.

Perché hai incluso /new e /unread ma non /unseen?

2 Mi Piace

Core prevede che i blocchi discourse-post-event abbiano una rappresentazione Markdown dedicata, allo stesso modo in cui già avviene per sondaggi, citazioni, onebox e sezioni comprimibili? Dal punto di vista tecnico, aggiungerne una a CookedProcessor sembra piuttosto fattibile: rilevare div.discourse-post-event, leggere i suoi attributi data-* e sostituirlo con un blocco Markdown preservato prima del passaggio generico di ReverseMarkdown.

2 Mi Piace

Grazie per il suggerimento, è stato implementato in questa PR che verrà unita a breve.

2 Mi Piace

Vorrei disattivarla, ma non vedo tale impostazione nella dashboard. Sto filtrando con “markdown”.

In realtà si tratta di una modifica in arrivo: devi andare su /admin/config/upcoming-changes?changeNamesFilter=enable_markdown_endpoints

Aggiorno il post originale per riflettere questo.

2 Mi Piace

L’ho disattivata, ma mi dice che non potrò selezionarla a breve. Non voglio rendere le cose troppo facili per i crawler, e quella vista elude alcuni dei metodi che uso per individuare i bot.

1 Mi Piace

Sì, ottimo punto, correggeremo. Il piano è che questa funzione rimanga disattivabile.

1 Mi Piace

Suona bene. Grazie!

Ecco la PR: UX: Hide permanent warning for markdown endpoints - Pull Request #45037 - discourse/discourse - GitHub

2 Mi Piace

Una piccola osservazione, nel caso fosse utile: un mese dopo che la funzionalità si è attivata qui, markdown-endpoint:cooked:* conteneva circa un milione di chiavi, l’87% dei nostri chiavi Redis (circa 570 MB). Quasi tutte provenivano da bot che recuperavano pagine in .md, con ogni post memorizzato nella cache per una settimana. Sembra davvero tanto Redis per una sola funzionalità.

Questo mi incuriosisce riguardo all’altro lato dell’equazione. Qualcuno ha notato visitatori reali tornare grazie a essa? In tal caso, sarebbe facile decidere di riattivarla. :slight_smile:

2 Mi Piace

Apprezzo il feedback, darò un’occhiata all’implementazione e anche all’uso di Redis qui su meta e su un paio di altre istanze.

2 Mi Piace