설명하신 방법은 커스텀 플러그인을 통해 가능할 것입니다. 이 플러그인은 markdown-it 스타일의 플러그인과 HTML을 위한 적절한 객체 저장소를 결합할 수 있습니다. 그러나 사용자가 입력한 코드가 서버 어디에서든 실행되도록 하는 것에 대해 보안 측면에서 주의가 필요합니다. Discourse는 백엔드에서 HTML과 JS를 안전하게 파싱하기 위해 게시물을 정화(sanitize)하는 데 이미 많은 노력을 기울이고 있습니다.
대신 브라우저에 Python 인터프리터를 임베드하여 클라이언트에서 코드를 실행하고 HTML 생성 과정을 완전히 생략하는 방식을 시도해 보시는 것이 더 효과적일 수 있습니다. JupyterLite를 사용하면 UI를 갖춘 JupyterLab을 브라우저에서 실행할 수 있습니다. 문서에 따르면, iframe 생성 시 코드를 자동으로 실행하도록 설정할 수 있습니다. 커스텀 HighlightJS 플러그인을 사용하여 Python 코드 블록에 실행 가능한 버튼을 생성하여 코드를 전달하거나, 자동으로 실행되도록 할 수 있습니다.
즉, 다음과 같은 방식입니다:
사용자가 Python 코드 블록이 포함된 게시물을 봅니다.
사용자가 코드 블록에 마우스를 올리면 브라우저에서 코드를 실행할 수 있는 버튼이 나타납니다.
사용자가 버튼을 클릭하면 코드 아래에 JupyterLite용 iframe이 생성되고, 코드 블록에서 코드가 가져와집니다.
이것은 단순히 JupyterLite로 향하는 iframe을 생성하는 HighlightJS 플러그인일 뿐이므로, 서버 코드가 필요 없이 Theme Component 내에서 모두 구현할 수 있습니다.
참고할 점: JupyterLite는 JupyterLab과 기능이 완전히 동일하지 않다고 설명되어 있으며, 패키지 임포트를 처리하는 방식이 어떻게 되는지 확실하지 않으므로 직접 호스팅해야 할 수도 있습니다. JupyterLite는 Pyodide를 사용하며 PyPI의 모든 wheel을 지원하므로 문제없이 작동할 것입니다.
@Alteras 감사합니다. 이 솔루션은 정말 직관적이고, “index.heml” 파일을 Discourse에 업로드하는 방법을 찾으면(이것은 .html 업로드를 활성화하기가 쉬우므로) iframe 코드로 서빙할 때 잘 작동합니다. 유일한 문제는 실제로 작동하지 않는다는 것입니다. 그렇게 시도해 보면 iframe에 렌더링되는 대신 index.html이 다운로드됩니다. iframe에 파일을 다운로드하지 않고 표시하도록 알려주는 메타 태그가 있을까요?