Discourse 코어에 이제 토픽 목록과 뷰를 위한 마크다운 엔드포인트가 포함되었습니다

Discourse는 이제 네이티브 마크다운(Markdown) 엔드포인트를 지원하여, AI 도구 및 기타 클라이언트가 전체 HTML 페이지를 파싱하지 않고도 포럼 콘텐츠를 더 쉽게 읽을 수 있도록 했습니다.

이 기능은 Upcoming Changes 시스템을 통해 모든 호스팅 사이트에서 기본적으로 활성화됩니다. 옵트아웃을 원하는 관리자는 enable_markdown_endpoints 사이트 설정을 비활성화하여 이를 수행할 수 있습니다.

원본 Discourse to Markdown 플러그인을 개발한 @benword에게 감사드립니다. 이 플러그인은 Discourse 코어에 포함된 이 기능의 선구자 역할을 했습니다.


마크다운 출력은 게시글의 렌더링된(“cooked”) HTML에서 생성되며, 확장된 링크와 처리된 포맷을 포함하여 독자가 보는 콘텐츠를 보존합니다. 인용, 원박스(onebox), 코드 블록, 투표, 접을 수 있는 섹션 등 Discourse 고유 요소는 마크다운으로 다시 변환됩니다. 주제 응답에는 메타데이터와 페이지네이션 링크가 포함되며, 변환된 게시글 본문은 콘텐츠 다이제스트를 사용하여 캐시되므로 편집 시 새로운 출력이 생성됩니다.

클라이언트는 .md URL을 통해 명시적으로 마크다운을 요청하거나 Accept: text/markdown 헤더를 전송할 수 있습니다. 협상(negotiation)은 품질 값(Quality values)을 존중하며, HTML 및 JSON보다 마크다운이 선호될 때 마크다운을 선택합니다. 명시적인 .md 요청은 해당 포맷을 유지합니다. 지원되는 HTML 페이지는 HTTP Link 헤더와 <link rel="alternate"> 요소를 통해 해당 마크다운 버전을 광고합니다.

20개의 좋아요

지원되는 주제 목록과 지원되지 않는 주제 목록을 확인해 주시겠습니까?

현재 저는 원래의 Discourse-to-Markdown 플러그인을 사용 중인데, 충돌하는 출력을 피하기 위해 이를 비활성화하고 제거해야 하나요? 조언 부탁드립니다.

플러그인과 예정된 기능이 비활성화된 상태에서는 정상적으로 작동합니다.

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 코어가 반환하는 마크다운을 존중하고 있는 것입니다.

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 블록에 대해, 투표, 인용, 원박스, 접이식 섹션과 동일한 방식으로 전용 마크다운 표현을 제공하는 것을 의도하고 있습니까? 기술적으로 CookedProcessor에 이를 추가하는 것은 충분히 실현 가능해 보입니다: div.discourse-post-event를 감지하고, 그 data-* 속성을 읽은 후, 범용 ReverseMarkdown 처리 전에 보존된 마크다운 블록으로 대체하면 됩니다.

2개의 좋아요

제안해 주셔서 감사합니다. 곧 병합될 이 PR에 해당 사항이 구현되었습니다.

2개의 좋아요