PIJSON::toJSON with optionally unicode masking

PIVariantTypes::Color::toName()
This commit is contained in:
2022-12-08 13:21:11 +03:00
parent b609ce8027
commit c4cb81a104
6 changed files with 39 additions and 25 deletions

View File

@@ -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()) {
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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -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 Целочисленный цвет.

View File

@@ -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;
}