// Vikunja is a to-do list application to facilitate your life. // Copyright 2018-present Vikunja and contributors. All rights reserved. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . package richtext import ( "bytes" "fmt" "strings" "github.com/JohannesKaufmann/dom" "golang.org/x/net/html" "golang.org/x/net/html/atom" ) // parseHTMLFragment parses an HTML fragment in a context (so tables/lists parse). func parseHTMLFragment(in []byte) ([]*html.Node, error) { context := &html.Node{Type: html.ElementNode, Data: "body", DataAtom: atom.Body} nodes, err := html.ParseFragment(bytes.NewReader(in), context) if err != nil { return nil, fmt.Errorf("parsing converted html: %w", err) } return nodes, nil } func renderHTMLNodes(nodes []*html.Node) (string, error) { var buf bytes.Buffer for _, n := range nodes { if err := html.Render(&buf, n); err != nil { return "", fmt.Errorf("rendering converted html: %w", err) } } return buf.String(), nil } // convertTaskListItems rewrites goldmark's GFM task-list output // (
  • text
  • ) into the TipTap //