version 5.5.4

add PIValueTree::merge
PIValueTreeConversions::from*File supports .override files (replace or add values)
empty JSON arrays now 0 size
This commit is contained in:
2026-02-03 18:56:58 +03:00
parent 563d9c5487
commit e22630b1bd
5 changed files with 61 additions and 8 deletions

View File

@@ -400,9 +400,9 @@ PIJSON PIJSON::parseValue(PIString & s) {
s.trim();
if (s.isEmpty()) return ret;
if (s[0] == '{') {
ret = parseObject(s.takeRange('{', '}'));
ret = parseObject(s.takeRange('{', '}').trim());
} else if (s[0] == '[') {
ret = parseArray(s.takeRange('[', ']'));
ret = parseArray(s.takeRange('[', ']').trim());
} else {
s.trim();
if (s.startsWith('"')) {

View File

@@ -42,6 +42,14 @@ PIString mask(const PIString & str) {
return ret;
}
PIString overrideFile(PIString path) {
if (path.isEmpty()) return {};
PIFile::FileInfo fi(path);
auto ext = fi.extension();
path.insert(path.size_s() - ext.size_s() - (ext.isEmpty() ? 0 : 1), ".override");
return path;
}
PIValueTree PIValueTreeConversions::fromPropertyStorage(const PIPropertyStorage & ps) {
PIValueTree ret;
@@ -292,7 +300,11 @@ PIString toTextTree(const PIValueTree & root, PIString prefix, PIValueTreeConver
ret += "\n[" + prefix + "]\n";
if (root.isArray() && options[PIValueTreeConversions::WithAttributes]) ret += toTextTreeAttributes(root, "", options);
for (const auto & c: root.children()) {
PIString cp = prefix;
if (c.hasChildren()) continue;
ret += toTextTree(c, prefix, options);
}
for (const auto & c: root.children()) {
if (!c.hasChildren()) continue;
ret += toTextTree(c, prefix, options);
}
} else {
@@ -315,9 +327,13 @@ PIString toTextTree(const PIValueTree & root, PIString prefix, PIValueTreeConver
PIString PIValueTreeConversions::toText(const PIValueTree & root, Options options) {
PIString ret;
for (const auto & c: root.children()) {
ret += toTextTree(c, PIString(), options);
if (c.hasChildren()) continue;
ret += toTextTree(c, {}, options);
}
for (const auto & c: root.children()) {
if (!c.hasChildren()) continue;
ret += toTextTree(c, {}, options);
}
return ret;
}
@@ -329,13 +345,26 @@ PIValueTree PIValueTreeConversions::fromText(const PIString & str) {
PIValueTree PIValueTreeConversions::fromJSONFile(const PIString & path) {
return PIValueTreeConversions::fromJSON(PIJSON::fromJSON(PIString::fromUTF8(PIFile::readAll(path))));
auto ret = PIValueTreeConversions::fromJSON(PIJSON::fromJSON(PIString::fromUTF8(PIFile::readAll(path))));
auto ofp = overrideFile(path);
if (PIFile::isExists(ofp)) {
auto override = PIValueTreeConversions::fromJSON(PIJSON::fromJSON(PIString::fromUTF8(PIFile::readAll(ofp))));
ret.merge(override);
}
return ret;
}
PIValueTree PIValueTreeConversions::fromTextFile(const PIString & path) {
PIFile f(path, PIIODevice::ReadOnly);
return PIValueTreeConversions::fromText(&f);
auto ret = PIValueTreeConversions::fromText(&f);
auto ofp = overrideFile(path);
if (PIFile::isExists(ofp)) {
PIFile of(ofp, PIIODevice::ReadOnly);
auto override = PIValueTreeConversions::fromText(&of);
ret.merge(override);
}
return ret;
}