/// <summary> /// Given a string, and a collection of highlighting instructions, create ANSI Escape Sequence instructions that will /// draw the highlighted text to the console. /// </summary> /// <param name="text">the text to print</param> /// <param name="formatting">the formatting instructions containing color information for the <paramref name="text"/></param> /// <param name="textWidth">the width of the console. This controls the word wrapping, and can usually be <see cref="Console.BufferWidth"/>.</param> /// <returns>A string of escape sequences that will draw the <paramref name="text"/></returns> /// <remarks> /// This function is different from most in that it involves drawing _output_ to the screen, rather than /// drawing typed user input. It's still useful because if users want syntax-highlighted input, chances are they /// also want syntax-highlighted output. It's sort of co-opting existing input functions for the purposes of output. /// </remarks> public static string RenderAnsiOutput(string text, IReadOnlyCollection <FormatSpan> formatting, int textWidth) { var rows = CellRenderer.ApplyColorToCharacters(formatting, text, textWidth); var initialCursor = ConsoleCoordinate.Zero; var finalCursor = new ConsoleCoordinate(rows.Length - 1, 0); var output = IncrementalRendering.CalculateDiff( previousScreen: new Screen(textWidth, rows.Length, initialCursor), currentScreen: new Screen(textWidth, rows.Length, finalCursor, new ScreenArea(initialCursor, rows, TruncateToScreenHeight: false)), ansiCoordinate: initialCursor ); return(output); }