diff --git a/html/node.go b/html/node.go index 633ee15d..1350eef2 100644 --- a/html/node.go +++ b/html/node.go @@ -18,6 +18,11 @@ const ( ElementNode CommentNode DoctypeNode + // RawNode nodes are not returned by the parser, but can be part of the + // Node tree passed to func Render to insert raw HTML (without escaping). + // If so, this package makes no guarantee that the rendered HTML is secure + // (from e.g. Cross Site Scripting attacks) or well-formed. + RawNode scopeMarkerNode ) diff --git a/html/render.go b/html/render.go index 8bf47ede..46879c08 100644 --- a/html/render.go +++ b/html/render.go @@ -134,6 +134,9 @@ func render1(w writer, n *Node) error { } } return w.WriteByte('>') + case RawNode: + _, err := w.WriteString(n.Data) + return err default: return errors.New("html: unknown node type") } diff --git a/html/render_test.go b/html/render_test.go index 11da54b3..1cd439e8 100644 --- a/html/render_test.go +++ b/html/render_test.go @@ -89,6 +89,14 @@ func TestRenderer(t *testing.T) { Type: TextNode, Data: "6", }, + 14: { + Type: CommentNode, + Data: "comm", + }, + 15: { + Type: RawNode, + Data: "7
8
9", + }, } // Build a tree out of those nodes, based on a textual representation. @@ -110,6 +118,8 @@ func TestRenderer(t *testing.T) { 11: `. .
`, 12: `. .
`, 13: `. . "6"`, + 14: `. . ""`, + 15: `. . "7
8
9"`, } if len(nodes) != len(treeAsText) { t.Fatal("len(nodes) != len(treeAsText)") @@ -145,7 +155,7 @@ func TestRenderer(t *testing.T) { want := `0<1

` + `23&4

` + - `5

6` + `5

67
8
9` b := new(bytes.Buffer) if err := Render(b, nodes[0]); err != nil { t.Fatal(err)