diff --git a/data/magic.mse-game/game b/data/magic.mse-game/game index a9cf714f..5fe711a9 100644 --- a/data/magic.mse-game/game +++ b/data/magic.mse-game/game @@ -941,7 +941,11 @@ keyword parameter type: match: [^(.,\n]+ keyword parameter type: name: prefix + description: Prefix for things like "walk" + placeholder: land + optional: false match: [A-Z][a-z]* + example: Forest ############################# All Magic keywords # By JrEye and Neko_Asakami diff --git a/src/data/keyword.cpp b/src/data/keyword.cpp index 8948b5df..2deb5578 100644 --- a/src/data/keyword.cpp +++ b/src/data/keyword.cpp @@ -18,11 +18,18 @@ DECLARE_TYPEOF_COLLECTION(const Keyword*); // ----------------------------------------------------------------------------- : Reflection +KeywordParam::KeywordParam() + : optional(true) +{} + IMPLEMENT_REFLECTION(KeywordParam) { REFLECT(name); REFLECT(description); + REFLECT(placeholder); + REFLECT(optional); REFLECT(match); REFLECT(script); + REFLECT(example); } IMPLEMENT_REFLECTION(KeywordMode) { REFLECT(name); @@ -129,7 +136,7 @@ void Keyword::prepare(const vector& param_types, bool force) { } parameters.push_back(p); // modify regex - regex += _(")(") + make_non_capturing(p->match) + _(")?("); + regex += _(")(") + make_non_capturing(p->match) + _(")") + (p->optional ? _("?") : _("")) + _("("); i = skip_tag(match, end); } else { regex += regex_escape(c); @@ -365,17 +372,18 @@ String KeywordDatabase::expand(const String& text, String part = s.substr(start, part_end - start); if ((j % 2) == 0) { // parameter + KeywordParam& kwp = *kw->parameters[j/2-1]; String param = untagged.substr(start_u, len_u); // untagged version if (param.empty()) { // placeholder - param = _("‹") + kw->parameters[j/2-1]->name + _("›"); + param = _("‹") + (kwp.placeholder.empty() ? kwp.name : kwp.placeholder) + _("›"); part = part + param; // keep tags } else if (kw->parameters[j/2-1]->script) { // apply parameter script ctx.setVariable(_("input"), to_script(part)); - part = kw->parameters[j/2-1]->script.invoke(ctx)->toString(); + part = kwp.script.invoke(ctx)->toString(); ctx.setVariable(_("input"), to_script(part)); - param = kw->parameters[j/2-1]->script.invoke(ctx)->toString(); + param = kwp.script.invoke(ctx)->toString(); } ctx.setVariable(String(_("param")) << (int)(j/2), to_script(param)); } diff --git a/src/data/keyword.hpp b/src/data/keyword.hpp index f95f281c..2d4ad29c 100644 --- a/src/data/keyword.hpp +++ b/src/data/keyword.hpp @@ -23,8 +23,11 @@ class KeywordTrie; /// Parameter type of keywords class KeywordParam { public: + KeywordParam(); String name; ///< Name of the parameter type - String description; ///< Description of the type + String description; ///< Description of the parameter type + String placeholder; ///< Placholder for , name is used if this is empty + bool optional; ///< Can this parameter be left out (a placeholder is then used) String match; ///< Regular expression to match OptionalScript script; ///< Transformation of the value for showing in the reminder text String example; ///< Example for preview dialog