package api import ( "net/http" "strings" ) const maxBody = 4 << 20 // folga sobre o limite de conteúdo da store (2 MiB) type renderInput struct { Content string `json:"content"` Format string `json:"format"` } // handleRender converte Markdown em HTML seguro (raw HTML do markdown é // escapado pelo goldmark; a nota em si é sempre renderizada via innerHTML). func (s *Server) handleRender(w http.ResponseWriter, r *http.Request) { var in renderInput if err := decodeJSON(r, &in, maxBody); err != nil { writeError(w, http.StatusBadRequest, "corpo JSON inválido") return } switch in.Format { case "html": // O preview de HTML usa iframe com sandbox no cliente; não renderiza aqui. writeError(w, http.StatusBadRequest, "formato html usa preview em iframe") return } var buf strings.Builder if err := s.md.Convert([]byte(in.Content), &buf); err != nil { writeError(w, http.StatusInternalServerError, "falha ao renderizar markdown") return } writeJSON(w, http.StatusOK, map[string]string{"html": buf.String()}) }