示例#1
0
        public override string Help(T state, object defaultValue)
        {
            var prompt = new Prompter <T>(_field.Template(TemplateUsage.DoubleHelp), _field.Form, null);
            var args   = HelpArgs(state, defaultValue);

            if (_showLimits)
            {
                args.Add(_min);
                args.Add(_max);
            }
            return(prompt.Prompt(state, _field, args.ToArray()).Prompt);
        }
示例#2
0
        private FormPrompt ClarifyPrompt(FieldStepState stepState, IRecognize <T> recognizer, T state)
        {
            var        clarify = NeedsClarification(stepState);
            FormPrompt prompt  = null;

            if (clarify != null)
            {
                var field    = ClarifyField(clarify, recognizer);
                var prompter = new Prompter <T>(field.Template(TemplateUsage.Clarify), field.Form, new RecognizeEnumeration <T>(field));
                prompt = prompter.Prompt(state, field, clarify.Response);
            }
            return(prompt);
        }
示例#3
0
        public NavigationField(string name, string startField, IForm <T> form, T state, FormState formState, Fields <T> fields)
            : base(name, FieldRole.Value)
        {
            Form = form;
            var field = form.Fields.Field(startField);

            SetFieldDescription(_form.Configuration.Navigation);
            SetOptional();
            foreach (var value in formState.Next.Names)
            {
                var svalue      = (string)value;
                var sfield      = form.Fields.Field(svalue);
                var fieldPrompt = sfield.Template(TemplateUsage.NavigationFormat);
                var prompter    = new Prompter <T>(fieldPrompt, form, sfield.Prompt.Recognizer);
                AddDescription(value, prompter.Prompt(state, sfield).Prompt, null, sfield.FieldDescription.Message ?? sfield.FieldDescription.Description);
                AddTerms(value, form.Fields.Field(svalue).FieldTerms.ToArray());
            }
            var template = field.Template(TemplateUsage.Navigation);

            SetPrompt(new PromptAttribute(template));
            SetRecognizer(new RecognizeEnumeration <T>(this));
            _prompt = new Prompter <T>(template, form, _recognizer, fields);
        }
示例#4
0
        private string ExpandTemplate(string template, string currentChoice, string noValue, T state, IField <T> field, object[] args, ref IList <DescribeAttribute> buttons)
        {
            bool foundUnspecified = false;
            int  last             = 0;
            int  numeric;
            var  response = new StringBuilder();

            foreach (Match match in _args.Matches(template))
            {
                var expr       = match.Groups[1].Value.Trim();
                var substitute = string.Empty;
                if (expr.StartsWith("&"))
                {
                    var name = expr.Substring(1);
                    if (name == string.Empty && field != null)
                    {
                        name = field.Name;
                    }
                    var pathField = _fields.Field(name);
                    substitute = Language.Normalize(pathField == null ? field.Name : pathField.FieldDescription.Description, _annotation.FieldCase);
                }
                else if (expr == "||")
                {
                    var builder    = new StringBuilder();
                    var values     = _recognizer.ValueDescriptions();
                    var useButtons = !field.AllowsMultiple &&
                                     (_annotation.ChoiceStyle == ChoiceStyleOptions.Auto ||
                                      _annotation.ChoiceStyle == ChoiceStyleOptions.Buttons ||
                                      _annotation.ChoiceStyle == ChoiceStyleOptions.Carousel);
                    if (values.Any() && _annotation.AllowDefault != BoolDefault.False && field.Optional)
                    {
                        values = values.Concat(new DescribeAttribute[] { new DescribeAttribute(Language.Normalize(noValue, _annotation.ChoiceCase)) });
                    }
                    string current = null;
                    if (_annotation.AllowDefault != BoolDefault.False)
                    {
                        if (!field.Optional)
                        {
                            if (!field.IsUnknown(state))
                            {
                                current = ExpandTemplate(currentChoice, null, noValue, state, field, args, ref buttons);
                            }
                        }
                        else
                        {
                            current = ExpandTemplate(currentChoice, null, noValue, state, field, args, ref buttons);
                        }
                    }
                    if (values.Any())
                    {
                        if (useButtons)
                        {
                            foreach (var value in values)
                            {
                                buttons.Add(value);
                            }
                        }
                        else
                        {
                            // Buttons do not support multiple selection so we fall back to text
                            if (((_annotation.ChoiceStyle == ChoiceStyleOptions.Auto || _annotation.ChoiceStyle == ChoiceStyleOptions.AutoText) &&
                                 values.Count() < 4) ||
                                (_annotation.ChoiceStyle == ChoiceStyleOptions.Inline))
                            {
                                // Inline choices
                                if (_annotation.ChoiceParens == BoolDefault.True)
                                {
                                    builder.Append('(');
                                }
                                var choices = new List <string>();
                                var i       = 1;
                                foreach (var value in values)
                                {
                                    choices.Add(string.Format(_annotation.ChoiceFormat, i, Language.Normalize(value.Description, _annotation.ChoiceCase)));
                                    ++i;
                                }
                                builder.Append(Language.BuildList(choices, _annotation.ChoiceSeparator, _annotation.ChoiceLastSeparator));
                                if (_annotation.ChoiceParens == BoolDefault.True)
                                {
                                    builder.Append(')');
                                }
                                if (current != null)
                                {
                                    builder.Append(" ");
                                    builder.Append(current);
                                }
                            }
                            else
                            {
                                // Separate line choices
                                if (current != null)
                                {
                                    builder.Append(current);
                                    builder.Append(" ");
                                }
                                var i = 1;
                                foreach (var value in values)
                                {
                                    builder.AppendLine();
                                    builder.Append("  ");
                                    if (!_annotation.AllowNumbers)
                                    {
                                        builder.Append("* ");
                                    }
                                    builder.AppendFormat(_annotation.ChoiceFormat, i, Language.Normalize(value.Description, _annotation.ChoiceCase));
                                    ++i;
                                }
                            }
                        }
                    }
                    else if (current != null)
                    {
                        builder.Append(" ");
                        builder.Append(current);
                    }
                    substitute = builder.ToString();
                }
                else if (expr.StartsWith("*"))
                {
                    // Status display of active results
                    var filled  = expr.ToLower().Trim().EndsWith("filled");
                    var builder = new StringBuilder();
                    if (match.Index > 0)
                    {
                        builder.AppendLine();
                    }
                    foreach (var entry in (from step in _fields where (!filled || !step.IsUnknown(state)) && step.Role == FieldRole.Value && step.Active(state) select step))
                    {
                        var format = new Prompter <T>(Template(entry, TemplateUsage.StatusFormat), _form, null);
                        builder.Append("* ").AppendLine(format.Prompt(state, entry).Prompt);
                    }
                    substitute = builder.ToString();
                }
                else if (expr.StartsWith("[") && expr.EndsWith("]"))
                {
                    // Generate a list from multiple fields
                    var paths  = expr.Substring(1, expr.Length - 2).Split(' ');
                    var values = new List <Tuple <IField <T>, object, string> >();
                    foreach (var spec in paths)
                    {
                        if (!spec.StartsWith("{") || !spec.EndsWith("}"))
                        {
                            throw new ArgumentException("Only {<field>} references are allowed in lists.");
                        }
                        var formatArgs = spec.Substring(1, spec.Length - 2).Trim().Split(':');
                        var name       = formatArgs[0];
                        if (name == string.Empty && field != null)
                        {
                            name = field.Name;
                        }
                        var format  = (formatArgs.Length > 1 ? "0:" + formatArgs[1] : "0");
                        var eltDesc = _fields.Field(name);
                        if (!eltDesc.IsUnknown(state))
                        {
                            var value = eltDesc.GetValue(state);
                            if (value.GetType() != typeof(string) && value.GetType().IsIEnumerable())
                            {
                                var eltValues = (value as System.Collections.IEnumerable);
                                foreach (var elt in eltValues)
                                {
                                    values.Add(Tuple.Create(eltDesc, elt, format));
                                }
                            }
                            else
                            {
                                values.Add(Tuple.Create(eltDesc, eltDesc.GetValue(state), format));
                            }
                        }
                    }
                    if (values.Count() > 0)
                    {
                        var elements = (from elt in values
                                        select Language.Normalize(ValueDescription(elt.Item1, elt.Item2, elt.Item3), _annotation.ValueCase)).ToArray();
                        substitute = Language.BuildList(elements, _annotation.Separator, _annotation.LastSeparator);
                    }
                }
                else if (expr.StartsWith("?"))
                {
                    // Conditional template
                    var subValue = ExpandTemplate(expr.Substring(1), currentChoice, null, state, field, args, ref buttons);
                    if (subValue == null)
                    {
                        substitute = string.Empty;
                    }
                    else
                    {
                        substitute = subValue;
                    }
                }
                else if (TryParseFormat(expr, out numeric))
                {
                    // Process ad hoc arg
                    if (numeric < args.Length && args[numeric] != null)
                    {
                        substitute = string.Format("{" + expr + "}", args);
                    }
                    else
                    {
                        foundUnspecified = true;
                        break;
                    }
                }
                else
                {
                    var formatArgs = expr.Split(':');
                    var name       = formatArgs[0];
                    if (name == string.Empty && field != null)
                    {
                        name = field.Name;
                    }
                    var pathDesc = _fields.Field(name);
                    if (pathDesc.IsUnknown(state))
                    {
                        if (noValue == null)
                        {
                            foundUnspecified = true;
                            break;
                        }
                        substitute = noValue;
                    }
                    else
                    {
                        var value = pathDesc.GetValue(state);
                        if (value.GetType() != typeof(string) && value.GetType().IsIEnumerable())
                        {
                            var values = (value as System.Collections.IEnumerable);
                            substitute = Language.BuildList(from elt in values.Cast <object>()
                                                            select Language.Normalize(ValueDescription(pathDesc, elt, "0"), _annotation.ValueCase),
                                                            _annotation.Separator, _annotation.LastSeparator);
                        }
                        else
                        {
                            var format = (formatArgs.Length > 1 ? "0:" + formatArgs[1] : "0");
                            substitute = ValueDescription(pathDesc, value, format);
                        }
                    }
                }
                response.Append(template.Substring(last, match.Index - last)).Append(substitute);
                last = match.Index + match.Length;
            }
            return(foundUnspecified ? null : response.Append(template.Substring(last, template.Length - last)).ToString());
        }