diff --git a/libs/main/serialization/pivaluetree_conversions.cpp b/libs/main/serialization/pivaluetree_conversions.cpp index 810c255b..2da4662b 100644 --- a/libs/main/serialization/pivaluetree_conversions.cpp +++ b/libs/main/serialization/pivaluetree_conversions.cpp @@ -26,34 +26,20 @@ const char _attribute_[] = "_attribute_"; PIString unmask(const PIString & str) { - PIString ret; - for (int i = 0; i < str.size_s(); ++i) { - if (str[i] == '\\') { - if (i < str.size_s() - 1) { - ++i; - ret += str[i]; - continue; - } - } - ret += str[i]; - } + PIString ret(str); + ret.unmask("#\\"); + if (ret.isNotEmpty()) + if (ret[0] == '\\') + ret.remove(0); return ret; } PIString mask(const PIString & str) { PIString ret = str; if (ret.isEmpty()) return ret; - int start = 0; - if (ret[0].isSpace()) { + ret.mask("#\\"); + if (ret[0].isSpace()) ret.insert(0, '\\'); - start = 1; - } - for (int i = start; i < ret.size_s(); ++i) { - if (ret[i] == '\\') { - ret.insert(i, '\\'); - ++i; - } - } return ret; } @@ -158,7 +144,7 @@ PIValueTree PIValueTreeConversions::fromText(PIIODevice * device) { continue; } line += l; - //piCout << line.replacedAll("\n", "\\n"); + //piCout << "L" << line.replacedAll("\n", "\\n"); if (line.size() < 2) { line.clear(); continue; @@ -168,11 +154,22 @@ PIValueTree PIValueTreeConversions::fromText(PIIODevice * device) { line.clear(); continue; } + if (line.startsWith('#')) { + line.clear(); + continue; + } type = PIVariant::typeName(); comm.clear(); - int ind = line.find('#'); - if (ind >= 0) { - comm = line.takeMid(ind + 1); + int ind = -1, cind = -1; + for (;;) { + ind = line.find('#', ind + 1); + if (ind < 0) break; + if (ind > 0) + if (line[ind - 1] == '\\') continue; + cind = ind; + } + if (cind >= 0) { + comm = line.takeMid(cind + 1); bool typed = false; if (comm.isNotEmpty()) { if (comm.size() == 1) typed = true; @@ -196,7 +193,7 @@ PIValueTree PIValueTreeConversions::fromText(PIIODevice * device) { line.cutRight(1).trim(); } ind = line.find('='); - if ((ind > 0) && (line[0] != '#')) { + if (ind > 0) { path = prefix; path << line.takeLeft(ind).split('.').trim(); line.cutLeft(1).trim(); @@ -213,6 +210,9 @@ PIValueTree PIValueTreeConversions::fromText(PIIODevice * device) { } other.back() = src;*/ } + } else { + line.clear(); + continue; } //piCout << path << line << comm; PIValueTree & leaf(ret[path]); diff --git a/libs/main/text/pistring.cpp b/libs/main/text/pistring.cpp index 930a59fd..120e1385 100644 --- a/libs/main/text/pistring.cpp +++ b/libs/main/text/pistring.cpp @@ -522,6 +522,27 @@ PIString PIString::simplified() const { } +PIString & PIString::mask(const PIString & symbols, PIChar mc) { + for (int i = 0; i < size_s(); ++i) + if (symbols.contains(at(i))) { + insert(i, mc); + ++i; + } + return *this; +} + + +PIString & PIString::unmask(const PIString & symbols, const PIChar mc) { + for (int i = 0; i < size_s() - 1; ++i) + if (at(i) == mc) { + if (symbols.contains(at(i + 1))) { + remove(i); + } + } + return *this; +} + + PIString & PIString::operator +=(const char * str) { if (!str) return *this; appendFromChars(str, -1, __syslocname__); diff --git a/libs/main/text/pistring.h b/libs/main/text/pistring.h index 502dc4a3..4b47e066 100644 --- a/libs/main/text/pistring.h +++ b/libs/main/text/pistring.h @@ -856,6 +856,18 @@ public: //! \~russian Возвращает \a PIString с заменёнными '?' не-ASCII символами. PIString simplified() const; + //! \~english Insert before any symbol from "symbols" symbol "mc" and return this string. + //! \~russian Вставляет перед любым символом из "symbols" символ "mc" и возвращает эту строку. + PIString & mask(const PIString & symbols, const PIChar mc = '\\'); + + PIString masked(const PIString & symbols, const PIChar mc = '\\') const {return PIString(*this).mask(symbols, mc);} + + //! \~english Remove symbol "mc" before any symbol from "symbols" and return this string. + //! \~russian Удаляет символ "mc" перед любым символом из "symbols" и возвращает эту строку. + PIString & unmask(const PIString & symbols, const PIChar mc = '\\'); + + PIString unmasked(const PIString & symbols, const PIChar mc = '\\') const {return PIString(*this).unmask(symbols, mc);} + //! \~english Split string with delimiter "delim" to \a PIStringList. //! \~russian Разделяет строку в \a PIStringList через разделитель "delim". //! \~\details @@ -879,6 +891,10 @@ public: //! \~russian Возвращает содержит ли строка символ "c". bool contains(const char c) const {return d.contains(PIChar(c));} + //! \~english Returns if string contains character "c". + //! \~russian Возвращает содержит ли строка символ "c". + bool contains(const PIChar c) const {return d.contains(c);} + //! \~english Returns if string contains substring "str". //! \~russian Возвращает содержит ли строка подстроку "str". bool contains(const char * str) const {return contains(PIString(str));} diff --git a/libs/main/types/colors.cpp b/libs/main/types/colors.cpp new file mode 100644 index 00000000..80bcfdf3 --- /dev/null +++ b/libs/main/types/colors.cpp @@ -0,0 +1,194 @@ +/* + PIP - Platform Independent Primitives + CSS colors + Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#include "colors_p.h" + +#define CSS_COLOR(n,v) {#n,v} + +struct CSSColor { + const char * name; + uint color; +} css_colors[] = { + CSS_COLOR(aliceblue ,0xf0f8ff), + CSS_COLOR(antiquewhite ,0xfaebd7), + CSS_COLOR(aqua ,0x00ffff), + CSS_COLOR(aquamarine ,0x7fffd4), + CSS_COLOR(azure ,0xf0ffff), + CSS_COLOR(beige ,0xf5f5dc), + CSS_COLOR(bisque ,0xffe4c4), + CSS_COLOR(black ,0x000000), + CSS_COLOR(blanchedalmond ,0xffebcd), + CSS_COLOR(blue ,0x0000ff), + CSS_COLOR(blueviolet ,0x8a2be2), + CSS_COLOR(brown ,0xa52a2a), + CSS_COLOR(burlywood ,0xdeb887), + CSS_COLOR(cadetblue ,0x5f9ea0), + CSS_COLOR(chartreuse ,0x7fff00), + CSS_COLOR(chocolate ,0xd2691e), + CSS_COLOR(coral ,0xff7f50), + CSS_COLOR(cornflowerblue ,0x6495ed), + CSS_COLOR(cornsilk ,0xfff8dc), + CSS_COLOR(crimson ,0xdc143c), + CSS_COLOR(cyan ,0x00ffff), + CSS_COLOR(darkblue ,0x00008b), + CSS_COLOR(darkcyan ,0x008b8b), + CSS_COLOR(darkgoldenrod ,0xb8860b), + CSS_COLOR(darkgray ,0xa9a9a9), + CSS_COLOR(darkgreen ,0x006400), + CSS_COLOR(darkgrey ,0xa9a9a9), + CSS_COLOR(darkkhaki ,0xbdb76b), + CSS_COLOR(darkmagenta ,0x8b008b), + CSS_COLOR(darkolivegreen ,0x556b2f), + CSS_COLOR(darkorange ,0xff8c00), + CSS_COLOR(darkorchid ,0x9932cc), + CSS_COLOR(darkred ,0x8b0000), + CSS_COLOR(darksalmon ,0xe9967a), + CSS_COLOR(darkseagreen ,0x8fbc8f), + CSS_COLOR(darkslateblue ,0x483d8b), + CSS_COLOR(darkslategray ,0x2f4f4f), + CSS_COLOR(darkslategrey ,0x2f4f4f), + CSS_COLOR(darkturquoise ,0x00ced1), + CSS_COLOR(darkviolet ,0x9400d3), + CSS_COLOR(deeppink ,0xff1493), + CSS_COLOR(deepskyblue ,0x00bfff), + CSS_COLOR(dimgray ,0x696969), + CSS_COLOR(dimgrey ,0x696969), + CSS_COLOR(dodgerblue ,0x1e90ff), + CSS_COLOR(firebrick ,0xb22222), + CSS_COLOR(floralwhite ,0xfffaf0), + CSS_COLOR(forestgreen ,0x228b22), + CSS_COLOR(fuchsia ,0xff00ff), + CSS_COLOR(gainsboro ,0xdcdcdc), + CSS_COLOR(ghostwhite ,0xf8f8ff), + CSS_COLOR(gold ,0xffd700), + CSS_COLOR(goldenrod ,0xdaa520), + CSS_COLOR(gray ,0x808080), + CSS_COLOR(green ,0x008000), + CSS_COLOR(greenyellow ,0xadff2f), + CSS_COLOR(grey ,0x808080), + CSS_COLOR(honeydew ,0xf0fff0), + CSS_COLOR(hotpink ,0xff69b4), + CSS_COLOR(indianred ,0xcd5c5c), + CSS_COLOR(indigo ,0x4b0082), + CSS_COLOR(ivory ,0xfffff0), + CSS_COLOR(khaki ,0xf0e68c), + CSS_COLOR(lavender ,0xe6e6fa), + CSS_COLOR(lavenderblush ,0xfff0f5), + CSS_COLOR(lawngreen ,0x7cfc00), + CSS_COLOR(lemonchiffon ,0xfffacd), + CSS_COLOR(lightblue ,0xadd8e6), + CSS_COLOR(lightcoral ,0xf08080), + CSS_COLOR(lightcyan ,0xe0ffff), + CSS_COLOR(lightgoldenrodyellow ,0xfafad2), + CSS_COLOR(lightgray ,0xd3d3d3), + CSS_COLOR(lightgreen ,0x90ee90), + CSS_COLOR(lightgrey ,0xd3d3d3), + CSS_COLOR(lightpink ,0xffb6c1), + CSS_COLOR(lightsalmon ,0xffa07a), + CSS_COLOR(lightseagreen ,0x20b2aa), + CSS_COLOR(lightskyblue ,0x87cefa), + CSS_COLOR(lightslategray ,0x778899), + CSS_COLOR(lightslategrey ,0x778899), + CSS_COLOR(lightsteelblue ,0xb0c4de), + CSS_COLOR(lightyellow ,0xffffe0), + CSS_COLOR(lime ,0x00ff00), + CSS_COLOR(limegreen ,0x32cd32), + CSS_COLOR(linen ,0xfaf0e6), + CSS_COLOR(magenta ,0xff00ff), + CSS_COLOR(maroon ,0x800000), + CSS_COLOR(mediumaquamarine ,0x66cdaa), + CSS_COLOR(mediumblue ,0x0000cd), + CSS_COLOR(mediumorchid ,0xba55d3), + CSS_COLOR(mediumpurple ,0x9370db), + CSS_COLOR(mediumseagreen ,0x3cb371), + CSS_COLOR(mediumslateblue ,0x7b68ee), + CSS_COLOR(mediumspringgreen ,0x00fa9a), + CSS_COLOR(mediumturquoise ,0x48d1cc), + CSS_COLOR(mediumvioletred ,0xc71585), + CSS_COLOR(midnightblue ,0x191970), + CSS_COLOR(mintcream ,0xf5fffa), + CSS_COLOR(mistyrose ,0xffe4e1), + CSS_COLOR(moccasin ,0xffe4b5), + CSS_COLOR(navajowhite ,0xffdead), + CSS_COLOR(navy ,0x000080), + CSS_COLOR(oldlace ,0xfdf5e6), + CSS_COLOR(olive ,0x808000), + CSS_COLOR(olivedrab ,0x6b8e23), + CSS_COLOR(orange ,0xffa500), + CSS_COLOR(orangered ,0xff4500), + CSS_COLOR(orchid ,0xda70d6), + CSS_COLOR(palegoldenrod ,0xeee8aa), + CSS_COLOR(palegreen ,0x98fb98), + CSS_COLOR(paleturquoise ,0xafeeee), + CSS_COLOR(palevioletred ,0xdb7093), + CSS_COLOR(papayawhip ,0xffefd5), + CSS_COLOR(peachpuff ,0xffdab9), + CSS_COLOR(peru ,0xcd853f), + CSS_COLOR(pink ,0xffc0cb), + CSS_COLOR(plum ,0xdda0dd), + CSS_COLOR(powderblue ,0xb0e0e6), + CSS_COLOR(purple ,0x800080), + CSS_COLOR(red ,0xff0000), + CSS_COLOR(rosybrown ,0xbc8f8f), + CSS_COLOR(royalblue ,0x4169e1), + CSS_COLOR(saddlebrown ,0x8b4513), + CSS_COLOR(salmon ,0xfa8072), + CSS_COLOR(sandybrown ,0xf4a460), + CSS_COLOR(seagreen ,0x2e8b57), + CSS_COLOR(seashell ,0xfff5ee), + CSS_COLOR(sienna ,0xa0522d), + CSS_COLOR(silver ,0xc0c0c0), + CSS_COLOR(skyblue ,0x87ceeb), + CSS_COLOR(slateblue ,0x6a5acd), + CSS_COLOR(slategray ,0x708090), + CSS_COLOR(slategrey ,0x708090), + CSS_COLOR(snow ,0xfffafa), + CSS_COLOR(springgreen ,0x00ff7f), + CSS_COLOR(steelblue ,0x4682b4), + CSS_COLOR(tan ,0xd2b48c), + CSS_COLOR(teal ,0x008080), + CSS_COLOR(thistle ,0xd8bfd8), + CSS_COLOR(tomato ,0xff6347), + CSS_COLOR(turquoise ,0x40e0d0), + CSS_COLOR(violet ,0xee82ee), + CSS_COLOR(wheat ,0xf5deb3), + CSS_COLOR(white ,0xffffff), + CSS_COLOR(whitesmoke ,0xf5f5f5), + CSS_COLOR(yellow ,0xffff00), + CSS_COLOR(yellowgreen ,0x9acd32), + {nullptr, 0} +}; + +#undef CSS_COLOR + + +PIColorCollection & PIColorCollection::instance() { + static PIColorCollection ret; + return ret; +} + + +PIColorCollection::PIColorCollection() { + CSSColor * c = css_colors; + while (c->name) { + css[c->name] = c->color | 0xFF000000; + ++c; + } +} + diff --git a/libs/main/types/colors_p.h b/libs/main/types/colors_p.h new file mode 100644 index 00000000..ca6ecffb --- /dev/null +++ b/libs/main/types/colors_p.h @@ -0,0 +1,35 @@ +/* + PIP - Platform Independent Primitives + Color collection + Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#ifndef colors_p_H +#define colors_p_H + +#include "pivarianttypes.h" + + +class PIColorCollection { +public: + static PIColorCollection & instance(); + PIVariantTypes::Color getCSS(const PIString & name) const {return css.value(name);} +private: + PIColorCollection(); + PIMap css; +}; + +#endif diff --git a/libs/main/types/pivariant.cpp b/libs/main/types/pivariant.cpp index 78ab2cf4..01a94659 100644 --- a/libs/main/types/pivariant.cpp +++ b/libs/main/types/pivariant.cpp @@ -110,7 +110,7 @@ void PIVariant::setValueFromString(const PIString & v) { case PIVariant::pivEnum: {PIVariantTypes::Enum r = toEnum(); r.selectName(v); setValue(r);} break; case PIVariant::pivFile: {PIVariantTypes::File r = toFile(); r.file = v; setValue(r);} break; case PIVariant::pivDir: {PIVariantTypes::Dir r = toDir(); r.dir = v; setValue(r);} break; - case PIVariant::pivColor: {if (v.startsWith('#')) setValue(PIVariantTypes::Color(v.mid(1).toUInt(16))); else setValue(PIVariantTypes::Color(v.toUInt()));} break; + case PIVariant::pivColor: {setValue(PIVariantTypes::Color::fromString(v));} break; case PIVariant::pivIODevice: {setValue(PIVariantTypes::IODevice());} break; // TODO case PIVariant::pivPoint: {PIStringList l = v.split(';'); if (l.size() >= 2) setValue(PIPointd(l[0].toDouble(), l[1].toDouble()));} break; case PIVariant::pivRect: {PIStringList l = v.split(';'); if (l.size() >= 4) setValue(PIRectd(l[0].toDouble(), l[1].toDouble(), l[2].toDouble(), l[3].toDouble()));} break; @@ -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 "0x" + PIString::fromNumber(r.rgba, 16);} + case PIVariant::pivColor: {PIVariantTypes::Color r; ba >> r; return r.toString();} 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; @@ -990,9 +990,7 @@ PIVariantTypes::Dir PIVariant::toDir() const { //! PIVariantTypes::Color PIVariant::toColor() const { PIByteArray ba(_content); - if (_type == PIVariant::pivString) {PIString r; ba >> r; - if (r.startsWith('#')) return PIVariantTypes::Color(r.mid(1).toUInt(16)); - else return PIVariantTypes::Color(r.toUInt());} + if (_type == PIVariant::pivString) {PIString r; ba >> r; return PIVariantTypes::Color::fromString(r);} if (_type == PIVariant::pivColor) {PIVariantTypes::Color r; ba >> r; return r;} if (_type == PIVariant::pivInt) {int v; ba >> v; return PIVariantTypes::Color(v);} if (_type == PIVariant::pivCustom) {return getAsValue(*this);} diff --git a/libs/main/types/pivarianttypes.cpp b/libs/main/types/pivarianttypes.cpp index c967bbc0..b36bdc14 100644 --- a/libs/main/types/pivarianttypes.cpp +++ b/libs/main/types/pivarianttypes.cpp @@ -19,6 +19,7 @@ #include "pivarianttypes.h" #include "pipropertystorage.h" +#include "colors_p.h" #ifndef MICRO_PIP # include "piiodevice.h" #endif @@ -156,3 +157,18 @@ PIVariantTypes::Enum & PIVariantTypes::Enum::operator <<(const PIStringList & v) (*this) << s; return *this; } + + + +PIVariantTypes::Color PIVariantTypes::Color::fromString(const PIString & str) { + if (str.size_s() < 2) return Color(); + PIString cn = str.toLowerCase().trim(); + if (cn.startsWith('#')) return Color(str.mid(1).toUInt(16)); + if (cn.startsWith("0x")) return Color(str.mid(2).toUInt(16)); + return PIColorCollection::instance().getCSS(cn); +} + + +PIString PIVariantTypes::Color::toString() const { + return "#" + PIString::fromNumber(rgba, 16); +} diff --git a/libs/main/types/pivarianttypes.h b/libs/main/types/pivarianttypes.h index 82bb7e14..567333a2 100644 --- a/libs/main/types/pivarianttypes.h +++ b/libs/main/types/pivarianttypes.h @@ -233,6 +233,14 @@ struct PIP_EXPORT Dir { struct PIP_EXPORT Color { Color(uint v = 0) {rgba = v;} + //! \~english Returns color from #HEX, 0xHEX or name. + //! \~russian Возвращает цвет от #HEX, 0xHEX или имени. + static Color fromString(const PIString & str); + + //! \~english Returns color as #HEX. + //! \~russian Возвращает цвет как #HEX. + PIString toString() const; + //! \~english Integer color. //! \~russian Целочисленный цвет. uint rgba; diff --git a/main.cpp b/main.cpp index 4fb8f6a3..e5cef845 100644 --- a/main.cpp +++ b/main.cpp @@ -49,7 +49,7 @@ int main(int argc, char * argv[]) { //piCout << PITime::fromString("05.12:56:333", "h.m.s"); //piCout << PIDateTime::fromString(PIDateTime::current().toString("__yyyy_MM_d__hh_mm_ss__"), "__yyyy_MM_d__hh_mm_ss__"); - piCout << PIVariantTypes::Color(); + /*piCout << PIVariantTypes::Color(); piCout << PIVariantTypes::Color(0xFF00FFff); PIVariant v = PIVariant::fromType(PIVariant::typeName()); piCout << PIVariant::typeName(); @@ -57,7 +57,12 @@ int main(int argc, char * argv[]) { piCout << PIVariant::typeIDFromName(PIVariant::typeName()); piCout << PIVariant::typeIDFromType(PIVariant::pivColor); v.setValueFromString("0xFF00FFff"); - piCout << v; + piCout << v;*/ + + PIString ms = "1239"; + + piCout << PIString("12\\\\3456789").masked(ms); + piCout << PIString("12\\\\3456789").masked(ms).unmasked(ms); return 0; }