Encodes property names properly in project.godot

This commit is contained in:
Haoyu Qiu 2019-12-20 10:03:15 +08:00
parent 2a4c528d06
commit e7e095da3f
5 changed files with 18 additions and 23 deletions

View file

@ -769,10 +769,7 @@ Error ProjectSettings::_save_settings_text(const String &p_file, const Map<Strin
String vstr;
VariantWriter::write_to_string(value, vstr);
if (F->get().find(" ") != -1)
file->store_string(F->get().quote() + "=" + vstr + "\n");
else
file->store_string(F->get() + "=" + vstr + "\n");
file->store_string(F->get().property_name_encode() + "=" + vstr + "\n");
}
}

View file

@ -4059,6 +4059,19 @@ String String::percent_decode() const {
return String::utf8(pe.ptr());
}
String String::property_name_encode() const {
// Escape and quote strings with extended ASCII or further Unicode characters
// as well as '"', '=' or ' ' (32)
const CharType *cstr = c_str();
for (int i = 0; cstr[i]; i++) {
if (cstr[i] == '=' || cstr[i] == '"' || cstr[i] < 33 || cstr[i] > 126) {
return "\"" + c_escape_multiline() + "\"";
}
}
// Keep as is
return *this;
}
String String::get_basename() const {
int pos = find_last(".");

View file

@ -338,6 +338,8 @@ public:
String percent_encode() const;
String percent_decode() const;
String property_name_encode() const;
bool is_valid_identifier() const;
bool is_valid_integer() const;
bool is_valid_float() const;

View file

@ -1530,9 +1530,6 @@ Error VariantParser::parse_tag_assign_eof(Stream *p_stream, int &line, String &r
} else if (c != '=') {
what += String::chr(c);
} else {
if (p_stream->is_utf8()) {
what.parse_utf8(what.ascii(true).get_data());
}
r_assign = what;
Token token;
get_token(p_stream, token, line, r_err_str);

View file

@ -1459,20 +1459,6 @@ void ResourceFormatSaverTextInstance::_find_resources(const Variant &p_variant,
}
}
static String _valprop(const String &p_name) {
// Escape and quote strings with extended ASCII or further Unicode characters
// as well as '"', '=' or ' ' (32)
const CharType *cstr = p_name.c_str();
for (int i = 0; cstr[i]; i++) {
if (cstr[i] == '=' || cstr[i] == '"' || cstr[i] < 33 || cstr[i] > 126) {
return "\"" + p_name.c_escape_multiline() + "\"";
}
}
// Keep as is
return p_name;
}
Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_resource, uint32_t p_flags) {
if (p_path.ends_with(".tscn")) {
@ -1675,7 +1661,7 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_r
String vars;
VariantWriter::write_to_string(value, vars, _write_resources, this);
f->store_string(_valprop(name) + " = " + vars + "\n");
f->store_string(name.property_name_encode() + " = " + vars + "\n");
}
}
@ -1747,7 +1733,7 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_r
String vars;
VariantWriter::write_to_string(state->get_node_property_value(i, j), vars, _write_resources, this);
f->store_string(_valprop(String(state->get_node_property_name(i, j))) + " = " + vars + "\n");
f->store_string(String(state->get_node_property_name(i, j)).property_name_encode() + " = " + vars + "\n");
}
if (i < state->get_node_count() - 1)