From c4cb81a104fce8b6888d803bcf0344a47887737b Mon Sep 17 00:00:00 2001 From: peri4 Date: Thu, 8 Dec 2022 13:21:11 +0300 Subject: [PATCH] PIJSON::toJSON with optionally unicode masking PIVariantTypes::Color::toName() --- libs/main/serialization/pijson.cpp | 21 ++++++++++++--------- libs/main/serialization/pijson.h | 6 +++--- libs/main/types/pivariant.cpp | 2 +- libs/main/types/pivarianttypes.cpp | 13 ++++++++----- libs/main/types/pivarianttypes.h | 10 +++++++--- main.cpp | 12 ++++++++---- 6 files changed, 39 insertions(+), 25 deletions(-) diff --git a/libs/main/serialization/pijson.cpp b/libs/main/serialization/pijson.cpp index b303726c..9d5e4621 100644 --- a/libs/main/serialization/pijson.cpp +++ b/libs/main/serialization/pijson.cpp @@ -349,9 +349,9 @@ PIJSON & PIJSON::operator[](const PIString & key) { } -PIString PIJSON::toJSON(PrintType print_type) const { +PIString PIJSON::toJSON(PrintType print_type, bool mask_unicode) const { PIString ret; - print(ret, *this, "", print_type == Tree, true); + print(ret, *this, "", print_type == Tree, true, false, mask_unicode); return ret; } @@ -457,11 +457,14 @@ PIJSON PIJSON::parseArray(PIString s) { } -PIString PIJSON::stringMask(const PIString & s) { +PIString PIJSON::stringMask(const PIString & s, bool mask_unicode) { PIString ret; for (auto c: s) { if (!c.isAscii()) { - ret += "\\u" + PIString::fromNumber(c.unicode16Code(), 16).expandLeftTo(4, '0'); + if (mask_unicode) + ret += "\\u" + PIString::fromNumber(c.unicode16Code(), 16).expandLeftTo(4, '0'); + else + ret += c; } else { char ca = c.toAscii(); switch (ca) { @@ -512,7 +515,7 @@ PIString PIJSON::stringUnmask(const PIString & s) { } -void PIJSON::print(PIString & s, const PIJSON & v, PIString tab, bool spaces, bool transform, bool comma) { +void PIJSON::print(PIString & s, const PIJSON & v, PIString tab, bool spaces, bool transform, bool comma, bool mask_unicode) { if (spaces) s += tab; /* switch (v.c_type) { @@ -526,7 +529,7 @@ void PIJSON::print(PIString & s, const PIJSON & v, PIString tab, bool spaces, bo } */ if (v.name().isNotEmpty()) { - s += '"' + (transform ? stringMask(v.name()) : v.name()) + "\":"; + s += '"' + (transform ? stringMask(v.name(), mask_unicode) : v.name()) + "\":"; if (spaces) s += ' '; } switch (v.c_type) { @@ -534,7 +537,7 @@ void PIJSON::print(PIString & s, const PIJSON & v, PIString tab, bool spaces, bo case PIJSON::Null: s += "null"; break; case PIJSON::Boolean: s += PIString::fromBool(v.c_value.toBool()); break; case PIJSON::Number: s += v.c_value.toString(); break; - case PIJSON::String: s += '"' + (transform ? stringMask(v.c_value.toString()) : v.c_value.toString()) + '"'; break; + case PIJSON::String: s += '"' + (transform ? stringMask(v.c_value.toString(), mask_unicode) : v.c_value.toString()) + '"'; break; case PIJSON::Object: s += "{"; if (spaces) s += '\n'; @@ -543,7 +546,7 @@ void PIJSON::print(PIString & s, const PIJSON & v, PIString tab, bool spaces, bo auto it = v.c_object.makeIterator(); int cnt = 0; while (it.next()) { - print(s, it.value(), ntab, spaces, transform, ++cnt < v.c_object.size_s()); + print(s, it.value(), ntab, spaces, transform, ++cnt < v.c_object.size_s(), mask_unicode); } } if (spaces) s += tab; @@ -555,7 +558,7 @@ void PIJSON::print(PIString & s, const PIJSON & v, PIString tab, bool spaces, bo { PIString ntab = tab + " "; for (int i = 0; i < v.c_array.size_s(); ++i) { - print(s, v.c_array[i], ntab, spaces, transform, i < v.c_array.size_s() - 1); + print(s, v.c_array[i], ntab, spaces, transform, i < v.c_array.size_s() - 1, mask_unicode); } } if (spaces) s += tab; diff --git a/libs/main/serialization/pijson.h b/libs/main/serialization/pijson.h index b449a5b7..5b09bcc7 100644 --- a/libs/main/serialization/pijson.h +++ b/libs/main/serialization/pijson.h @@ -169,7 +169,7 @@ public: //! \~english Returns text representation of JSON tree. //! \~russian Возвращает текстовое представление дерева JSON. - PIString toJSON(PrintType print_type = Compact) const; + PIString toJSON(PrintType print_type = Compact, bool mask_unicode = true) const; //! \~english Parse text representation of JSON "str" and returns it root element. //! \~russian Разбирает текстовое представление JSON "str" и возвращает его корневой элемент. @@ -185,9 +185,9 @@ private: static PIJSON parseValue(PIString & s); static PIJSON parseObject(PIString s); static PIJSON parseArray(PIString s); - static PIString stringMask(const PIString & s); + static PIString stringMask(const PIString & s, bool mask_unicode); static PIString stringUnmask(const PIString & s); - static void print(PIString & s, const PIJSON & v, PIString tab, bool spaces, bool transform = false, bool comma = false); + static void print(PIString & s, const PIJSON & v, PIString tab, bool spaces, bool transform = false, bool comma = false, bool mask_unicode = true); PIString c_name; PIVariant c_value; diff --git a/libs/main/types/pivariant.cpp b/libs/main/types/pivariant.cpp index 012ce6ad..4c5d3f11 100644 --- a/libs/main/types/pivariant.cpp +++ b/libs/main/types/pivariant.cpp @@ -822,7 +822,7 @@ PIString PIVariant::toString() const { case PIVariant::pivEnum: {PIVariantTypes::Enum r; ba >> r; return r.selectedName();} case PIVariant::pivFile: {PIVariantTypes::File r; ba >> r; return r.file;} case PIVariant::pivDir: {PIVariantTypes::Dir r; ba >> r; return r.dir;} - case PIVariant::pivColor: {PIVariantTypes::Color r; ba >> r; return r.toString(true);} + case PIVariant::pivColor: {PIVariantTypes::Color r; ba >> r; return r.toName();} case PIVariant::pivIODevice: {PIVariantTypes::IODevice r; ba >> r; return "IODevice";} // TODO case PIVariant::pivPoint: {PIPointd r; ba >> r; return PIString::fromNumber(r.x) + ";" + PIString::fromNumber(r.y);} break; case PIVariant::pivRect: {PIRectd r; ba >> r; return PIString::fromNumber(r.left()) + ";" + PIString::fromNumber(r.bottom()) + ";" + PIString::fromNumber(r.width()) + ";" + PIString::fromNumber(r.height());} break; diff --git a/libs/main/types/pivarianttypes.cpp b/libs/main/types/pivarianttypes.cpp index e82a07e6..520b36db 100644 --- a/libs/main/types/pivarianttypes.cpp +++ b/libs/main/types/pivarianttypes.cpp @@ -169,10 +169,13 @@ PIVariantTypes::Color PIVariantTypes::Color::fromString(const PIString & str) { } -PIString PIVariantTypes::Color::toString(bool find_name) const { - if (find_name) { - PIString ret = PIColorCollection::instance().getCSSName(*this); - if (ret.isNotEmpty()) return ret; - } +PIString PIVariantTypes::Color::toString() const { return "#" + PIString::fromNumber(rgba, 16); } + + +PIString PIVariantTypes::Color::toName() const { + PIString ret = PIColorCollection::instance().getCSSName(*this); + if (ret.isNotEmpty()) return ret; + return toString(); +} diff --git a/libs/main/types/pivarianttypes.h b/libs/main/types/pivarianttypes.h index 712eb386..3bd097fe 100644 --- a/libs/main/types/pivarianttypes.h +++ b/libs/main/types/pivarianttypes.h @@ -237,9 +237,13 @@ struct PIP_EXPORT Color { //! \~russian Возвращает цвет от #HEX, 0xHEX или имени. static Color fromString(const PIString & str); - //! \~english Returns color as #HEX, or as name if "find_name". - //! \~russian Возвращает цвет как #HEX, либо как имя если "find_name". - PIString toString(bool find_name = false) const; + //! \~english Returns color as #HEX. + //! \~russian Возвращает цвет как #HEX. + PIString toString() const; + + //! \~english Returns name or #HEX if no suitable name. + //! \~russian Возвращает имя, либо #HEX, если нет подходящего имени. + PIString toName() const; //! \~english Integer color. //! \~russian Целочисленный цвет. diff --git a/main.cpp b/main.cpp index e5cef845..4f7571ab 100644 --- a/main.cpp +++ b/main.cpp @@ -59,10 +59,14 @@ int main(int argc, char * argv[]) { v.setValueFromString("0xFF00FFff"); piCout << v;*/ - PIString ms = "1239"; - - piCout << PIString("12\\\\3456789").masked(ms); - piCout << PIString("12\\\\3456789").masked(ms).unmasked(ms); + PIJSON j; + j["123"] = "str"; + j[PIString::fromUTF8("ключ")] = PIString::fromUTF8("str_значение"); + piCout << j; + piCout << PIJSON::fromJSON(j.toJSON(PIJSON::Compact, true)); + piCout << PIJSON::fromJSON(j.toJSON(PIJSON::Compact, false)); + piCout << PIJSON::fromJSON(j.toJSON(PIJSON::Tree, true)); + piCout << PIJSON::fromJSON(j.toJSON(PIJSON::Tree, false)); return 0; }