diff --git a/code/internal/server/render.go b/code/internal/server/render.go index 9617bd0..7be4610 100644 --- a/code/internal/server/render.go +++ b/code/internal/server/render.go @@ -33,7 +33,7 @@ type dashboardData struct { // taskDetailData holds data for the task detail panel. type taskDetailData struct { Task supervisor.Task - Content string + Content template.HTML HasReport bool } @@ -204,10 +204,12 @@ func renderSearchResults(data searchResultsData) string { } // renderTaskDetail generates HTML fragment for task detail panel. +// Content is rendered from markdown to HTML using goldmark. func renderTaskDetail(t supervisor.Task, content string, hasReport bool) string { + rendered := renderMarkdown([]byte(content), t.ID+".md") data := taskDetailData{ Task: t, - Content: content, + Content: template.HTML(rendered), HasReport: hasReport, } diff --git a/code/internal/server/server_test.go b/code/internal/server/server_test.go index 8f305d4..4b0616f 100644 --- a/code/internal/server/server_test.go +++ b/code/internal/server/server_test.go @@ -1602,6 +1602,24 @@ func TestTaskDetail_HasInnerWrapper(t *testing.T) { } } +func TestTaskDetail_RendersMarkdownAsHTML(t *testing.T) { + srv := setupTestServer(t) + + req := httptest.NewRequest(http.MethodGet, "/task/T01", nil) + w := httptest.NewRecorder() + srv.Router.ServeHTTP(w, req) + + body := w.Body.String() + // Markdown headers should be rendered as HTML