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:
@@ -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('"')) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user