/// <summary> /// Generate completions for the "current" token in the specified input /// text. /// </summary> /// <param name="inputText">The input text string.</param> /// <param name="cursorIndex">The current cursor index into the string. /// </param> /// <param name="tokenCompleter">Token completion handler to invoke. /// </param> /// <returns>The generated completion set.</returns> /// <exception cref="ArgumentNullException">Thrown when <paramref name="tokenCompleter" /> /// is null.</exception> public static TokenCompletionSet Create(string inputText, int cursorIndex, ITokenCompleter tokenCompleter) { if (tokenCompleter == null) { throw new ArgumentNullException(nameof(tokenCompleter)); } var completions = Create(inputText, cursorIndex, tokenCompleter, out int tokenStartIndex, out int tokenLength); var originalToken = new Token(new Substring(inputText, tokenStartIndex, tokenLength)); return(new TokenCompletionSet(inputText, originalToken, completions)); }
private ConsoleLineInput CreateInput(IConsoleOutput consoleOutput = null, ITokenCompleter tokenCompleter = null) { consoleOutput = consoleOutput ?? Substitute.For <IConsoleOutput>(); var buffer = new ConsoleInputBuffer(); var history = new ConsoleHistory(); var input = new ConsoleLineInput(consoleOutput, buffer, history) { TokenCompleter = tokenCompleter }; input.ConsoleOutput.Should().BeSameAs(consoleOutput); input.Buffer.Should().BeSameAs(buffer); input.History.Should().BeSameAs(history); input.TokenCompleter.Should().BeSameAs(tokenCompleter); input.InsertMode.Should().BeTrue(); return(input); }
private static ConsoleReader CreateReader(IEnumerable <ConsoleKeyInfo> keyStream, ITokenCompleter tokenCompleter = null) { var consoleOutput = new SimulatedConsoleOutput(); var consoleInput = new SimulatedConsoleInput(keyStream); var input = new ConsoleLineInput(consoleOutput, new ConsoleInputBuffer(), new ConsoleHistory()) { TokenCompleter = tokenCompleter }; return(new ConsoleReader(input, consoleInput, consoleOutput, null)); }
private static string Process(IEnumerable <ConsoleKeyInfo> keyInfo, ITokenCompleter tokenCompleter = null) => CreateReader(keyInfo.Concat(ConsoleKey.Enter), tokenCompleter).ReadLine();
private static string Process(ITokenCompleter tokenCompleter, params IEnumerable <ConsoleKeyInfo>[] keyInfo) => Process(keyInfo.SelectMany(x => x), tokenCompleter: tokenCompleter);
/// <summary> /// Generate completions for the "current" token in the specified input /// text. /// </summary> /// <param name="inputText">The input text string.</param> /// <param name="cursorIndex">The current cursor index into the string. /// </param> /// <param name="tokenCompleter">Token completion handler to invoke. /// </param> /// <param name="existingTokenStartIndex">Receives the start index of /// the current token.</param> /// <param name="existingTokenLength">Receives the length of the current /// token.</param> /// <returns>The generated completions.</returns> private static IReadOnlyList <string> Create(string inputText, int cursorIndex, ITokenCompleter tokenCompleter, out int existingTokenStartIndex, out int existingTokenLength) { const TokenizerOptions tokenizerOptions = TokenizerOptions.AllowPartialInput | TokenizerOptions.HandleDoubleQuoteAsTokenDelimiter; // // Try to parse the line. If we fail to parse it, then just // return immediately. // var tokens = StringUtilities.Tokenize(inputText, tokenizerOptions).ToList(); // // Figure out which token we're in // int tokenIndex; for (tokenIndex = 0; tokenIndex < tokens.Count; ++tokenIndex) { var token = tokens[tokenIndex]; if (cursorIndex > token.OuterEndingOffset) { continue; } if (cursorIndex >= token.OuterStartingOffset) { break; } // Insert an empty token here. tokens.Insert( tokenIndex, new Token(new Substring(inputText, cursorIndex, 0))); break; } if (tokenIndex < tokens.Count) { var token = tokens[tokenIndex]; existingTokenStartIndex = token.OuterStartingOffset; existingTokenLength = token.OuterLength; } else { existingTokenStartIndex = cursorIndex; existingTokenLength = 0; } // // Ask for completions. // var tokenStrings = tokens.Select(token => RemoveQuotes(token.ToString())).ToArray(); var completions = tokenCompleter.GetCompletions(tokenStrings, tokenIndex).ToList(); // If necessary quote! for (var j = 0; j < completions.Count; j++) { var completion = completions[j]; if (!completion.StartsWith(QuoteStr, StringComparison.OrdinalIgnoreCase)) { completions[j] = StringUtilities.QuoteIfNeeded(completions[j], QuoteChar); } } return(completions); }
private ConsoleLineInput CreateInputWithText(IConsoleOutput consoleOutput, string text, ITokenCompleter tokenCompleter = null) { var input = CreateInput(consoleOutput, tokenCompleter); input.Insert(text); input.MoveCursorToEnd(); return(input); }