Разбор неэкранированного HTML в HTML шаблон в Go

Я создал эту действительно простую программу для тестирования.

package main

import (
    "fmt"
    "github.com/microcosm-cc/bluemonday"
    "github.com/pressly/chi"
    "github.com/russross/blackfriday"
    "github.com/unrolled/render"
    "net/http"
)

func main() {
    r := chi.NewRouter()
    r.Get("/", homepageGET)
    http.ListenAndServe(":8080", r)
}

func homepageGET(w http.ResponseWriter, r *http.Request) {
    Renderer := render.New(render.Options{
        Directory:    "frontend",
        Extensions:   []string{".tmpl", ".html"},
        UnEscapeHTML: true,
    })
    unsafe := blackfriday.MarkdownCommon([]byte("**bolded text**"))
    markdownContent := bluemonday.UGCPolicy().SanitizeBytes(unsafe)
    fmt.Print(string(markdownContent))
    Renderer.HTML(w, http.StatusOK, "index", map[string]interface{}{
        "content": fmt.Sprintf(string(markdownContent))})
}

И тогда у меня есть HTML-файл, не содержащий ничего кроме:

<body>
  {{ .content }}
</body>

Команда fmt.Print печатает "<p><strong>bolded text</strong></p>msgstr ", в то время как это вставлено в страницу HTML как:"&lt;p&gt;&lt;strong&gt;bolded text&lt;/strong&gt;&lt;/p&gt;".

Я полагаю, что это связано с экранированным HTML, но для развернутого пакета / рендеринга я настраиваю его как неэкранированный. Я был бы очень признателен за любую помощь в работе тестовой программы (желательно вместе с развернутым / рендерингом).

1 ответ

Решение

В Go вы можете привести известные безопасные строки html к типу template.HTML, и поскольку развернутый / рендер использует Go html/template для рендеринга HTML вы должны быть в состоянии использовать только это.

Renderer.HTML(w, http.StatusOK, "index", map[string]interface{}{
        "content": template.HTML(markdownContent),
})
Другие вопросы по тегам