Discourse コアにトピック一覧とビュー用の Markdown エンドポイントが追加されました

Discourse はネイティブの Markdown エンドポイントをサポートするようになり、AI ツールや他のクライアントが完全な HTML ページを解析せずにフォーラムのコンテンツを読み取ることが容易になりました。

この機能は、Upcoming Changes システムを通じてホストされたすべてのサイトでデフォルトで有効になります。オプトアウトしたい管理者は、enable_markdown_endpoints サイト設定を無効にすることで対応できます。

@benword さんが作成した元の Discourse to Markdown プラグイン に感謝いたします。これは Discourse コアにおけるこの機能の前身となりました。


Markdown 出力は、投稿のレンダリング済み(「cooked」)HTML から生成され、読み手が確認する内容(展開されたリンクや処理済みのフォーマットを含む)が保持されます。引用、Onebox、コードブロック、投票、折りたたみ可能なセクションなどの Discourse 固有の要素は Markdown に変換されます。トピックのレスポンスにはメタデータとページネーションリンクが含まれ、変換された投稿本文はコンテンツダイジェストを使用してキャッシュされるため、編集を行うと新しい出力が生成されます。

クライアントは、.md URL を使用するか、Accept: text/markdown ヘッダーを送信することで、明示的に Markdown をリクエストできます。ネゴシエーションは品質値を尊重し、HTML や JSON より Markdown が優先されている場合に Markdown を選択します。明示的な .md リクエストは、その形式を維持します。サポートされている HTML ページは、HTTP Link ヘッダーと <link rel="alternate"> 要素を通じて、その Markdown 相当物を示します。

「いいね!」 20

どのトピックリストがサポートされているか、またサポートされていないかを詳しく説明してもらえますか?

現在、オリジナルのDiscourse-to-Markdownプラグインを使用しているため、出力の競合を避けるために無効化して削除する必要がありますか?ご教示ください。

プラグインなしで、また近日公開予定の機能を有効にしても正常に動作します。

「いいね!」 1

1つ質問です:Cloudflareのプロキシを使用している場合、コア機能と彼らの変換ツールの間に競合があるように見えます。質問は、プロキシの背後にいる場合、その機能が有料プラン向けであるため、ヘッダーのHTMLから.mdへの変換が彼らによって阻止されるのか、それともクライアント側で変換に対応しているため、それが関係なく変換が行われるのか、ということです。

はい。プラグインが有効なままの場合、一部のコアエンドポイントが置き換えられてしまうため、現在コアに組み込まれた機能を使用するには、無効化/アンインストールすることを推奨します。

現在、以下がサポートされています:

サポート対象 例
メインリスト /latest.md, /hot.md, /top.md
認証が必要な個人向けリスト /new.md, /unread.md
デフォルトのカテゴリ/サブカテゴリリスト /c/support/6.md, /c/parent/child/12.md
単一タグのリスト /tag/example.md, /tag/example/123.md

/categories.md と /tags.md もディレクトリとして追加でサポートされています。ルート定義

Cloudflareの機能についてはあまり詳しくありませんが、私の理解では、サーバーに到達する前に Accept text/markdown リクエストをキャッチし、HTMLを変換して提供するという仕組みのようです。したがって、Cloudflareを使用している場合、その機能がDiscourseの機能を上書きするようになると思われます。

「いいね!」 3

有効化されていれば上書きされるということですね? 彼らのブログには、オリジン自体がそのヘッダーを配信することを阻止しているかどうかに関する情報は見つかりませんでした。

確実なことは言えませんが、最も簡単な方法は、ライブサイトでテストして、メタが出力するものと出力を比較することです。含まれるコンテンツには違いが生じます。Cloudflareの機能を有効にしても無効にしても取得されるレスポンスが同じであれば、Discourseコアが返すMarkdownが尊重されていることになります。

「いいね!」 1

ご指摘ありがとうございます。以下にその件に関する回答をまとめます。

  • X-Discourse-Route: topics/show: トピックを処理している Discourse (Ruby on Rails) の内部コントローラー/アクションを示します。
  • X-Runtime: 0.133969: アプリケーションがレスポンスを生成するのに要した時間(約133ms)。
  • Cf-Ray: ...-GRU: グアラウロス/サンパウロ(GRU)の Cloudflare エッジノードによって処理されたリクエスト。
  • Cf-Cache-Status: DYNAMIC および Cache-Control: no-cache, no-store: エッジキャッシュに滞留しない動的コンテンツ。
  • .json を付与しない通常の HTML URL を検査すると、サーバーは以下を返します:
    • Link: <https://segredin.com/t/conselhos-duvidosos/22054.md>; rel="alternate"; type="text/markdown"
    • X-Discourse-Crawler-View: true(Discourse がクローラーやリーダー向けに .md / ネイティブ Markdown 形式のクリーンなバージョンも提供していることを示す)。

代替バージョンを示すヘッダー Link:Link: <https://segredin.com/t/conselhos-duvidosos/22054.md>; rel="alternate"; type="text/markdown"

DNS レベルの外部機能とは独立して、オリジンから Vary: Accept を返します。

リクエストが .json を付与しない場合、.md がデフォルトの変換として返されます。

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

Claude からのリクエストが123,000件あったにもかかわらず、このコア機能を Discourse に更新して以降、トラフィックが急激に増加していないため、少し疑問に思っていました。今後数週間、様子を見続けます。

ありがとうございます。カテゴリとタグで絞り込んだトピックリストで最初に試したところ動作しなかったため、混乱していました。テスト用の例をうまく選べない傾向があります。

/new と /unread は含めていますが、/unseen はなぜ含めていないのですか?

「いいね!」 1

コアチームは、discourse-post-event ブロックに、投票や引用、ワンボックス、折りたたみセクションと同様に専用の Markdown 表現を持たせることを意図していますか? 技術的には、CookedProcessor にこれを追加するのはかなり実現可能に見えます。div.discourse-post-event を検出し、その data-* 属性を読み取り、一般的な ReverseMarkdown パスを行う前に、保持された Markdown ブロックに置き換えるだけです。

「いいね!」 2

ご提案ありがとうございます。まもなくマージされる予定のこのPRに実装されています。

「いいね!」 2