/* SPDX-License-Identifier: MPL-2.0 */ #include "recorder.h" #include namespace jm { static void escape(const char *s, std::string &out) { out += '"'; for (const unsigned char *p = reinterpret_cast(s); *p; ++p) { const unsigned char c = *p; switch (c) { case '"': out += "\\\""; break; case '\\': out += "\\\\"; break; case '\n': out += "\\n"; break; case '\r': out += "\\r"; break; case '\t': out += "\\t"; break; default: if (c < 0x20) { char buf[8]; std::snprintf(buf, sizeof buf, "\\u%04x", c); out += buf; } else out += static_cast(c); // UTF-8 passes through as it is } } out += '"'; } void Events::begin(const char *name) { if (!m_first) m_out += ','; m_first = false; m_out += '['; escape(name, m_out); } void Events::props(const librevenge::RVNGPropertyList &list) { m_out += '{'; bool first = true; librevenge::RVNGPropertyList::Iter it(list); for (it.rewind(); it.next();) { if (!first) m_out += ','; first = false; escape(it.key(), m_out); m_out += ':'; if (const librevenge::RVNGPropertyListVector *vec = it.child()) { m_out += '['; for (unsigned long i = 0; i < vec->count(); ++i) { if (i) m_out += ','; props((*vec)[i]); } m_out += ']'; } else if (it()) escape(it()->getStr().cstr(), m_out); else m_out += "null"; } m_out += '}'; } void Events::event(const char *name) { begin(name); m_out += ']'; } void Events::event(const char *name, const librevenge::RVNGPropertyList &list) { begin(name); m_out += ','; props(list); m_out += ']'; } void Events::text(const char *name, const librevenge::RVNGString &text) { begin(name); m_out += ','; escape(text.cstr(), m_out); m_out += ']'; } } // namespace jm