#ifndef OFX_XML_H #define OFX_XML_H // Copyright OpenFX and contributors to the OpenFX project. // SPDX-License-Identifier: BSD-3-Clause namespace OFX { namespace XML { inline std::string escape(const std::string &s) { std::string ns; for (size_t i=0;i': ns += ">"; break; case '&': ns += "&"; break; case '"': ns += """; break; case '\'': ns += "'"; break; default: { unsigned char c = (unsigned char)(s[i]); // Escape even the whitespace characters '\n' '\r' '\t', although they are valid // XML, because they would be converted to space when re-read. // See http://www.w3.org/TR/xml/#AVNormalize if ((0x01 <= c && c <= 0x1f) || (0x7F <= c && c <= 0x9F)) { // these characters must be escaped in XML 1.1 // http://www.w3.org/TR/xml/#sec-references ns += "&#x"; if (c > 0xf) { int d = c / 0x10; ns += d < 10 ? ('0' + d) : ('A' + d - 10); } int d = c & 0xf; ns += d < 10 ? ('0' + d) : ('A' + d - 10); ns += ';'; } else { ns += s[i]; } } break; } } return ns; } inline std::string attribute(const std::string &at, const std::string &val) { return at + "=" + "\"" + escape(val) + "\" "; } inline std::string attribute(const std::string &st, int val) { std::ostringstream o; o << val; return attribute(st, o.str()); } } } #endif