diff options
| author | Charles Weill <weill@google.com> | 2015-10-23 16:08:20 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2015-11-25 17:04:43 +0000 |
| commit | 3f6b91b1136e25e75da71b727e536ba4f4066fd5 (patch) | |
| tree | ec367c5f323c512f62aee1c51c6f291511b64d36 /src/encoding/xml/xml.go | |
| parent | a48de745b28a39d58dcd916f410704f0f7d75d7c (diff) | |
| download | go-3f6b91b1136e25e75da71b727e536ba4f4066fd5.tar.xz | |
encoding/xml: Add CDATA-wrapper output support to xml.Marshal.
Fixes #12963
Change-Id: Icc50dfb6130fe1e189d45f923c2f7408d3cf9401
Reviewed-on: https://go-review.googlesource.com/16047
Reviewed-by: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/encoding/xml/xml.go')
| -rw-r--r-- | src/encoding/xml/xml.go | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/encoding/xml/xml.go b/src/encoding/xml/xml.go index 6c7debe521..bd766a6934 100644 --- a/src/encoding/xml/xml.go +++ b/src/encoding/xml/xml.go @@ -1943,6 +1943,46 @@ func Escape(w io.Writer, s []byte) { EscapeText(w, s) } +var ( + cdataStart = []byte("<![CDATA[") + cdataEnd = []byte("]]>") + cdataEscape = []byte("]]]]><![CDATA[>") +) + +// emitCDATA writes to w the CDATA-wrapped plain text data s. +// It escapes CDATA directives nested in s. +func emitCDATA(w io.Writer, s []byte) error { + if len(s) == 0 { + return nil + } + if _, err := w.Write(cdataStart); err != nil { + return err + } + for { + i := bytes.Index(s, cdataEnd) + if i >= 0 && i+len(cdataEnd) <= len(s) { + // Found a nested CDATA directive end. + if _, err := w.Write(s[:i]); err != nil { + return err + } + if _, err := w.Write(cdataEscape); err != nil { + return err + } + i += len(cdataEnd) + } else { + if _, err := w.Write(s); err != nil { + return err + } + break + } + s = s[i:] + } + if _, err := w.Write(cdataEnd); err != nil { + return err + } + return nil +} + // procInst parses the `param="..."` or `param='...'` // value out of the provided string, returning "" if not found. func procInst(param, s string) string { |
