mirror of
https://github.com/amyinspace/MagicSetEditor2.git
synced 2026-06-13 05:57:00 -04:00
improved handling of aliasses and warnings
git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@51 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
@@ -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 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 {
|
|||||||
}
|
}
|
||||||
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>
|
|||||||
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);
|
||||||
}
|
}
|
||||||
|
|||||||
+19
-6
@@ -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() {
|
|||||||
}
|
}
|
||||||
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));
|
||||||
// aliasses?
|
|
||||||
map<String,String>::const_iterator it = aliasses.find(key);
|
|
||||||
if (it != aliasses.end()) {
|
|
||||||
key = it->second;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Reader::unknownKey() {
|
void Reader::unknownKey() {
|
||||||
|
// aliasses?
|
||||||
|
map<String,String>::const_iterator it = aliasses.find(key);
|
||||||
|
if (it != aliasses.end()) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (indent == expected_indent) {
|
if (indent == expected_indent) {
|
||||||
warning(_("Unexpected key: '") + key + _("'"));
|
warning(_("Unexpected key: '") + key + _("'"));
|
||||||
do {
|
do {
|
||||||
|
|||||||
@@ -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 {
|
|||||||
/// 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 {
|
|||||||
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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user