Allow to escape closing brackets in CFG tags
This commit is contained in:
parent
29de658c29
commit
0d122ce459
|
@ -208,7 +208,7 @@ Error ConfigFile::_internal_save(Ref<FileAccess> file) {
|
||||||
file->store_string("\n");
|
file->store_string("\n");
|
||||||
}
|
}
|
||||||
if (!E.key.is_empty()) {
|
if (!E.key.is_empty()) {
|
||||||
file->store_string("[" + E.key + "]\n\n");
|
file->store_string("[" + E.key.replace("]", "\\]") + "]\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const KeyValue<String, Variant> &F : E.value) {
|
for (const KeyValue<String, Variant> &F : E.value) {
|
||||||
|
@ -308,7 +308,7 @@ Error ConfigFile::_parse(const String &p_path, VariantParser::Stream *p_stream)
|
||||||
if (!assign.is_empty()) {
|
if (!assign.is_empty()) {
|
||||||
set_value(section, assign, value);
|
set_value(section, assign, value);
|
||||||
} else if (!next_tag.name.is_empty()) {
|
} else if (!next_tag.name.is_empty()) {
|
||||||
section = next_tag.name;
|
section = next_tag.name.replace("\\]", "]");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1304,6 +1304,7 @@ Error VariantParser::_parse_tag(Token &token, Stream *p_stream, int &line, Strin
|
||||||
if (p_simple_tag) {
|
if (p_simple_tag) {
|
||||||
r_tag.name = "";
|
r_tag.name = "";
|
||||||
r_tag.fields.clear();
|
r_tag.fields.clear();
|
||||||
|
bool escaping = false;
|
||||||
|
|
||||||
if (p_stream->is_utf8()) {
|
if (p_stream->is_utf8()) {
|
||||||
CharString cs;
|
CharString cs;
|
||||||
|
@ -1314,7 +1315,15 @@ Error VariantParser::_parse_tag(Token &token, Stream *p_stream, int &line, Strin
|
||||||
return ERR_PARSE_ERROR;
|
return ERR_PARSE_ERROR;
|
||||||
}
|
}
|
||||||
if (c == ']') {
|
if (c == ']') {
|
||||||
break;
|
if (escaping) {
|
||||||
|
escaping = false;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (c == '\\') {
|
||||||
|
escaping = true;
|
||||||
|
} else {
|
||||||
|
escaping = false;
|
||||||
}
|
}
|
||||||
cs += c;
|
cs += c;
|
||||||
}
|
}
|
||||||
|
@ -1327,7 +1336,15 @@ Error VariantParser::_parse_tag(Token &token, Stream *p_stream, int &line, Strin
|
||||||
return ERR_PARSE_ERROR;
|
return ERR_PARSE_ERROR;
|
||||||
}
|
}
|
||||||
if (c == ']') {
|
if (c == ']') {
|
||||||
break;
|
if (escaping) {
|
||||||
|
escaping = false;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (c == '\\') {
|
||||||
|
escaping = true;
|
||||||
|
} else {
|
||||||
|
escaping = false;
|
||||||
}
|
}
|
||||||
r_tag.name += String::chr(c);
|
r_tag.name += String::chr(c);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1223,7 +1223,7 @@ ProjectList::Item ProjectList::load_project_data(const String &p_path, bool p_fa
|
||||||
PackedStringArray unsupported_features = ProjectSettings::get_unsupported_features(project_features);
|
PackedStringArray unsupported_features = ProjectSettings::get_unsupported_features(project_features);
|
||||||
|
|
||||||
uint64_t last_edited = 0;
|
uint64_t last_edited = 0;
|
||||||
if (FileAccess::exists(conf)) {
|
if (cf_err == OK) {
|
||||||
// The modification date marks the date the project was last edited.
|
// The modification date marks the date the project was last edited.
|
||||||
// This is because the `project.godot` file will always be modified
|
// This is because the `project.godot` file will always be modified
|
||||||
// when editing a project (but not when running it).
|
// when editing a project (but not when running it).
|
||||||
|
|
Loading…
Reference in New Issue