aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/xml/xml.go
diff options
context:
space:
mode:
authorCharles Weill <weill@google.com>2015-10-23 16:08:20 -0400
committerRuss Cox <rsc@golang.org>2015-11-25 17:04:43 +0000
commit3f6b91b1136e25e75da71b727e536ba4f4066fd5 (patch)
treeec367c5f323c512f62aee1c51c6f291511b64d36 /src/encoding/xml/xml.go
parenta48de745b28a39d58dcd916f410704f0f7d75d7c (diff)
downloadgo-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.go40
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 {