Commit e156e051 authored by twanvl's avatar twanvl

improved handling of aliasses and warnings

parent 1d8af552
...@@ -40,6 +40,7 @@ IMPLEMENT_REFLECTION(StyleSheet) { ...@@ -40,6 +40,7 @@ IMPLEMENT_REFLECTION(StyleSheet) {
tag.addAlias(300, _("dpi"), _("card_dpi")); tag.addAlias(300, _("dpi"), _("card_dpi"));
tag.addAlias(300, _("background"), _("card_background")); tag.addAlias(300, _("background"), _("card_background"));
tag.addAlias(300, _("info_style"), _("set_info_style")); tag.addAlias(300, _("info_style"), _("set_info_style"));
tag.addAlias(300, _("align"), _("alignment"));
REFLECT(game); REFLECT(game);
REFLECT(full_name); REFLECT(full_name);
......
...@@ -32,12 +32,20 @@ ScriptValueP OptionalScript::invoke(Context& ctx) const { ...@@ -32,12 +32,20 @@ ScriptValueP OptionalScript::invoke(Context& ctx) const {
} }
} }
void OptionalScript::parse(Reader& reader) {
try {
script = ::parse(unparsed);
} catch (const ParseError& e) {
reader.warning(e.what());
}
}
// custom reflection, different for each type // custom reflection, different for each type
template <> void Reader::handle(OptionalScript& os) { template <> void Reader::handle(OptionalScript& os) {
handle(os.unparsed); handle(os.unparsed);
// read the script os.parse(*this);
os.script = parse(os.unparsed);
} }
template <> void Writer::handle(const OptionalScript& os) { template <> void Writer::handle(const OptionalScript& os) {
......
...@@ -55,10 +55,12 @@ class OptionalScript { ...@@ -55,10 +55,12 @@ class OptionalScript {
} }
return false; return false;
} }
private: private:
ScriptP script; ///< The script, may be null if there is no script ScriptP script; ///< The script, may be null if there is no script
String unparsed; ///< Unparsed script, for writing back to a file String unparsed; ///< Unparsed script, for writing back to a file
// parse the unparsed string, while reading
void parse(Reader&);
DECLARE_REFLECTION(); DECLARE_REFLECTION();
template <typename T> friend class Scriptable; template <typename T> friend class Scriptable;
}; };
...@@ -95,7 +97,8 @@ template <typename T> ...@@ -95,7 +97,8 @@ template <typename T>
void Reader::handle(Scriptable<T>& s) { void Reader::handle(Scriptable<T>& s) {
handle(s.script.unparsed); handle(s.script.unparsed);
if (starts_with(s.script.unparsed, _("script:"))) { if (starts_with(s.script.unparsed, _("script:"))) {
s.script.script = parse(s.script.unparsed); s.script.unparsed = s.script.unparsed.substr(7);
s.script.parse(*this);
} else { } else {
handle(value); handle(value);
} }
......
...@@ -52,7 +52,14 @@ void Reader::handleAppVersion() { ...@@ -52,7 +52,14 @@ void Reader::handleAppVersion() {
} }
void Reader::warning(const String& msg) { void Reader::warning(const String& msg) {
wxMessageBox((msg + _("\nOn line: ")) << line_number << _("\nIn file: ") << filename, _("Warning"), wxOK | wxICON_EXCLAMATION); warnings += String(_("\nOn line ")) << line_number << _(": \t") << msg;
}
void Reader::showWarnings() {
if (!warnings.empty()) {
wxMessageBox(_("Warnings while reading file:\n") + filename + _("\n") + warnings, _("Warning"), wxOK | wxICON_EXCLAMATION);
warnings.clear();
}
} }
bool Reader::enterBlock(const Char* name) { bool Reader::enterBlock(const Char* name) {
...@@ -118,14 +125,20 @@ void Reader::readLine() { ...@@ -118,14 +125,20 @@ void Reader::readLine() {
} }
key = cannocial_name_form(trim(line.substr(indent, pos - indent))); key = cannocial_name_form(trim(line.substr(indent, pos - indent)));
value = pos == String::npos ? _("") : trim_left(line.substr(pos+1)); value = pos == String::npos ? _("") : trim_left(line.substr(pos+1));
}
void Reader::unknownKey() {
// aliasses? // aliasses?
map<String,String>::const_iterator it = aliasses.find(key); map<String,String>::const_iterator it = aliasses.find(key);
if (it != aliasses.end()) { if (it != aliasses.end()) {
key = it->second; if (aliasses.find(it->second) != aliasses.end()) {
// alias points to another alias, don't follow it, there is the risk of infinite loops
} else {
// try this key instead
key = it->second;
return;
}
} }
}
void Reader::unknownKey() {
if (indent == expected_indent) { if (indent == expected_indent) {
warning(_("Unexpected key: '") + key + _("'")); warning(_("Unexpected key: '") + key + _("'"));
do { do {
......
...@@ -42,6 +42,8 @@ class Reader { ...@@ -42,6 +42,8 @@ class Reader {
/** Used for "include file" keys. */ /** Used for "include file" keys. */
Reader(const String& filename); Reader(const String& filename);
~Reader() { showWarnings(); }
/// Tell the reflection code we are reading /// Tell the reflection code we are reading
inline bool reading() const { return true; } inline bool reading() const { return true; }
/// Is the thing currently being read 'complex', i.e. does it have children /// Is the thing currently being read 'complex', i.e. does it have children
...@@ -52,8 +54,10 @@ class Reader { ...@@ -52,8 +54,10 @@ class Reader {
/// Read and check the application version /// Read and check the application version
void handleAppVersion(); void handleAppVersion();
/// Show a warning message, but continue reading /// Add a warning message, but continue reading
void warning(const String& msg); void warning(const String& msg);
/// Show all warning messages, but continue reading
void showWarnings();
// --------------------------------------------------- : Handling objects // --------------------------------------------------- : Handling objects
/// Handle an object: read it if it's name matches /// Handle an object: read it if it's name matches
...@@ -111,6 +115,8 @@ class Reader { ...@@ -111,6 +115,8 @@ class Reader {
InputStreamP input; InputStreamP input;
/// Text stream wrapping the input stream /// Text stream wrapping the input stream
wxTextInputStream stream; wxTextInputStream stream;
/// Accumulated warning messages
String warnings;
// --------------------------------------------------- : Reading the stream // --------------------------------------------------- : Reading the stream
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment