public void NewlineIsExtractedAsAnInstruction() { var data = Environment.NewLine + "simple test" + Environment.NewLine + "string"; var colourControlItems = ColourControlSplitter.Split(data).Select(t => t.ToString()); var newLineControlItem = new ColourControlItem(instructions: new [] {new ColourControlItem.ControlInstruction(ColourControlItem.ControlCode.NewLine)}); var expected = new [] { newLineControlItem.ToString(), new ColourControlItem("simple test").ToString(), newLineControlItem.ToString(), new ColourControlItem("string").ToString(), }; Assert.That(colourControlItems, Is.EqualTo(expected)); }
private void ProcessItem(ColourControlItem colourControlItem) { if (colourControlItem.Text != null) WriteText(colourControlItem); else { foreach (var instruction in colourControlItem.Instructions) { switch (instruction.Code) { case ColourControlItem.ControlCode.SetBackground: _consoleOutInterface.Background = instruction.Arg; break; case ColourControlItem.ControlCode.SetForeground: _consoleOutInterface.Foreground = instruction.Arg; break; case ColourControlItem.ControlCode.NewLine: if (!_lastWriteWasPassiveNewLine) _consoleOutInterface.NewLine(); else _lastWriteWasPassiveNewLine = false; break; case ColourControlItem.ControlCode.Push: _colourStack.Push(new ColourState(_consoleOutInterface.Foreground, _consoleOutInterface.Background)); break; case ColourControlItem.ControlCode.Pop: var popped = _colourStack.Pop(); _consoleOutInterface.Foreground = popped.ForegroundColour; _consoleOutInterface.Background = popped.BackgroundColour; break; } } } }
private void WriteTextWithPrefix(ColourControlItem colourControlItem) { var text = colourControlItem.Text; var remaining = text.Length; var textPos = 0; do { if (_consoleOutInterface.CursorLeft == 0) { var currentFG = _consoleOutInterface.Foreground; var currentBG = _consoleOutInterface.Background; _consoleOutInterface.Foreground = _prefixForeground; _consoleOutInterface.Background = _prefixBackground; _consoleOutInterface.Write(PrefixText); _consoleOutInterface.Foreground = currentFG; _consoleOutInterface.Background = currentBG; } var available = _consoleOutInterface.BufferWidth - _consoleOutInterface.CursorLeft; var section = remaining > available ? text.Substring(textPos, available) : text.Substring(textPos); _consoleOutInterface.Write(section); textPos += section.Length; remaining -= section.Length; } while (remaining > 0); }
private void WriteText(ColourControlItem colourControlItem) { var currentLine = _consoleOutInterface.CursorTop; if (PrefixText != null) WriteTextWithPrefix(colourControlItem); else _consoleOutInterface.Write(colourControlItem.Text); _lastWriteWasPassiveNewLine = (colourControlItem.Text.Length > 0 && _consoleOutInterface.CursorLeft == 0); }
private void ProcessColourControlItem(ColourControlItem colourControlItem) { if (colourControlItem.PrefixAffinity && string.IsNullOrEmpty(colourControlItem.Text)) { _cachedPrefixInstructions.AddRange(colourControlItem.Instructions); StoreCurrentIfPresent(); return; } if (!string.IsNullOrEmpty(colourControlItem.Text)) { StoreCurrentIfPresent(); var splitWords = SplitWords(colourControlItem.Text, _tabLength); if (splitWords.Any()) { splitWords.First().AddPrefixInstructions(_cachedPrefixInstructions); _cachedPrefixInstructions.Clear(); } if (splitWords.Length > 1) Words.AddRange(splitWords.Take(splitWords.Length - 1)); _current = splitWords[splitWords.Length - 1]; } else if (InstructionIsNewLineOnly(colourControlItem)) { StoreCurrentIfPresent(); _current = new SplitWord(0, 0, string.Empty); _current.AddPrefixInstructions(_cachedPrefixInstructions); _current.AddSuffixInstructions(colourControlItem.Instructions); _cachedPrefixInstructions.Clear(); } else AddSuffixInstructionsToCurrent(colourControlItem.Instructions); }
private bool InstructionIsNewLineOnly(ColourControlItem item) { return item.Instructions.All(i => i.Code == ColourControlItem.ControlCode.NewLine); }