public void TestLineWrap() { var testLine = "01"; IAnsiDecoder vt100 = new AnsiDecoder(); vt100.Encoding = Encoding.UTF8; DynamicScreen screen; // If a file has a single \n in it, it has two lines. screen = new DynamicScreen(testLine.Length); vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes("\n")); Assert.AreEqual(2, screen.NumLines); Assert.AreEqual(2, screen.Lines.Count); // If a file has a one line that is small + a \n in it, it has two lines. screen = new DynamicScreen(testLine.Length); vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes($"0\n")); Assert.AreEqual(2, screen.NumLines); Assert.AreEqual(2, screen.Lines.Count); // If a file has a one line that fits + a \n in it, it has two lines. screen = new DynamicScreen(testLine.Length); vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes($"{testLine}\n")); Assert.AreEqual(2, screen.NumLines); Assert.AreEqual(2, screen.Lines.Count); // A full width line, one line screen = new DynamicScreen(testLine.Length); vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes(testLine)); Assert.AreEqual(1, screen.NumLines); Assert.AreEqual(1, screen.Lines.Count); // Two full width lines, two lines screen = new DynamicScreen(testLine.Length); vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes($"{testLine}\n{testLine}")); Assert.AreEqual(2, screen.NumLines); Assert.AreEqual(2, screen.Lines.Count); // wrapping scenarios // a full width line + 1 char, two lines screen = new DynamicScreen(testLine.Length); vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes(testLine + "!")); Assert.AreEqual(1, screen.NumLines); Assert.AreEqual(2, screen.Lines.Count); // one full width line + one full width line + 1 char, three lines screen = new DynamicScreen(testLine.Length); vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes($"{testLine}\n{testLine}!")); Assert.AreEqual(2, screen.NumLines); Assert.AreEqual(3, screen.Lines.Count); }
public void ReadAndRenderFile(string _filename) { IAnsiDecoder vt100 = new AnsiDecoder(); //vt100.Encoding = encodingInfo.GetEncoding (); // encodingInfo.Name, new EncoderExceptionFallback(), new DecoderReplacementFallback ("U") ); Screen screen = new Screen(80, 160); vt100.Subscribe(screen); using (BinaryReader reader = new BinaryReader(File.Open(_filename, FileMode.Open))) { try { int read = 0; while ((read = reader.Read()) != -1) { vt100.Input(new byte[] { (byte)read }); } } catch (EndOfStreamException) { } } System.Console.Write(screen.ToString()); Bitmap bitmap = screen.ToBitmap(new Font("Courier New", 10)); bitmap.Save(_filename + ".png", System.Drawing.Imaging.ImageFormat.Png); }
public AnsiTextBox() : base() { vt100 = new AnsiDecoder(); screenS = new ScreenStream(); screenS.InjectTo = vt100; vt100.Encoding = System.Text.Encoding.GetEncoding("ASCII"); vt100.Subscribe(this); }
// Example: // [01musing[00m [38;2;85;85;85mSystem[39m; // | 1 | 2 | 3 | 4 // <bold>using</bold><normal> </normal><color>System</color><normal>;</normal> public void TestAttributeRuns() { IAnsiDecoder vt100 = new AnsiDecoder(); vt100.Encoding = Encoding.UTF8; DynamicScreen screen; screen = new DynamicScreen(100); vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes("[01musing[00m [38;2;85;85;85mSystem[39m;")); Assert.AreEqual(1, screen.NumLines); Assert.AreEqual(1, screen.Lines.Count); Assert.AreEqual(4, screen.Lines[0].Runs.Count); Screen.Character c; // Test using grid based API c = screen[0, 0]; Assert.AreEqual('u', c.Char); Assert.AreEqual(true, c.Attributes.Bold); Assert.AreEqual(Color.White, c.Attributes.ForegroundColor); c = screen[1, 0]; Assert.AreEqual('s', c.Char); Assert.AreEqual(true, c.Attributes.Bold); Assert.AreEqual(Color.White, c.Attributes.ForegroundColor); c = screen[2, 0]; Assert.AreEqual('i', c.Char); Assert.AreEqual(true, c.Attributes.Bold); Assert.AreEqual(Color.White, c.Attributes.ForegroundColor); c = screen[3, 0]; Assert.AreEqual('n', c.Char); Assert.AreEqual(true, c.Attributes.Bold); Assert.AreEqual(Color.White, c.Attributes.ForegroundColor); c = screen[4, 0]; Assert.AreEqual('g', c.Char); Assert.AreEqual(true, c.Attributes.Bold); Assert.AreEqual(Color.White, c.Attributes.ForegroundColor); c = screen[5, 0]; Assert.AreEqual(' ', c.Char); Assert.AreEqual(false, c.Attributes.Bold); Assert.AreEqual(Color.White, c.Attributes.ForegroundColor); c = screen[6, 0]; Assert.AreEqual('S', c.Char); Assert.AreEqual(false, c.Attributes.Bold); Assert.AreEqual(Color.FromArgb(85, 85, 85), c.Attributes.ForegroundColor); // Test using Run-based API var run = screen.Lines[0].Runs[0]; Assert.AreEqual("using", screen.Lines[0].Text[run.Start..(run.Start + run.Length)]);
protected void UnRegisterForAnsiEventsFrom(AnsiDecoder decoder) { decoder.SaveCursor -= SaveCursor; decoder.RestoreCursor -= RestoreCursor; decoder.MoveCursor -= MoveCursor; decoder.MoveCursorTo -= MoveCursorTo; decoder.MoveCursorToColumn -= MoveCursorToColumn; decoder.MoveCursorToBeginningOfLineBelow -= MoveCursorToBeginningOfLineBelow; decoder.MoveCursorToBeginningOfLineAbove -= MoveCursorToBeginningOfLineAbove; decoder.ClearScreen -= ClearScreen; decoder.ClearLine -= ClearLine; decoder.SetGraphicRendition -= SetGraphicRendition; decoder.ModeChanged -= ModeChanged; decoder.GetSize -= GetSize; decoder.GetCursorPosition -= GetCursorPosition; }
protected void RegisterForAnsiEventsFrom(AnsiDecoder decoder) { decoder.SaveCursor += SaveCursor; decoder.RestoreCursor += RestoreCursor; decoder.MoveCursor += MoveCursor; decoder.MoveCursorTo += MoveCursorTo; decoder.MoveCursorToColumn += MoveCursorToColumn; decoder.MoveCursorToBeginningOfLineBelow += MoveCursorToBeginningOfLineBelow; decoder.MoveCursorToBeginningOfLineAbove += MoveCursorToBeginningOfLineAbove; decoder.ClearScreen += ClearScreen; decoder.ClearLine += ClearLine; decoder.SetGraphicRendition += SetGraphicRendition; decoder.ModeChanged += ModeChanged; decoder.GetSize += GetSize; decoder.GetCursorPosition += GetCursorPosition; }
public Screen ReadAndRenderFile(string _filename, Encoding _encoding, Size _size) { IAnsiDecoder vt100 = new AnsiDecoder(); //vt100.Encoding = Encoding.GetEncoding ( encodingInfo.Name, new EncoderExceptionFallback(), new DecoderReplacementFallback ("U") ); vt100.Encoding = _encoding; Screen screen = new Screen(_size.Width, _size.Height); vt100.Subscribe(screen); using (Stream stream = File.Open(_filename, FileMode.Open)) { try { int read = 0; while ((read = stream.ReadByte()) != -1) { vt100.Input(new byte[] { (byte)read }); } } catch (EndOfStreamException) { } } //System.Console.Write ( screen.ToString() ); Bitmap bitmap = screen.ToBitmap(new Font("Courier New", 6)); bitmap.Save("..\\build\\" + Path.GetFileNameWithoutExtension(_filename) + "_" + _encoding.EncodingName + ".png", System.Drawing.Imaging.ImageFormat.Png); /* * foreach ( Screen.Character ch in screen ) * { * if ( ch.Char != 0x20 ) * { * System.Console.WriteLine ( "Non-space character: {0} 0x{1:X4}", ch.Char, (int) ch.Char ); * } * } */ return(screen); }
public void TestTabs() { IAnsiDecoder vt100 = new AnsiDecoder(); vt100.Encoding = Encoding.UTF8; DynamicScreen screen; screen = new DynamicScreen(4); vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes("\t")); Assert.AreEqual(1, screen.NumLines); Assert.AreEqual(1, screen.Lines.Count); Assert.AreEqual(1, screen.Lines[0].Runs.Count); Assert.AreEqual(screen.TabSpaces, screen.Lines[0].Text.Length); screen = new DynamicScreen(4); vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes($"012\t")); Assert.AreEqual(1, screen.NumLines); Assert.AreEqual(1, screen.Lines.Count); Assert.AreEqual(2, screen.Lines[0].Runs.Count); Assert.AreEqual(screen.TabSpaces, screen.Lines[0].Text.Length); // \t // 012 screen = new DynamicScreen(4); vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes($"\t012")); Assert.AreEqual(1, screen.NumLines); Assert.AreEqual(2, screen.Lines.Count); Assert.AreEqual(1, screen.Lines[0].Runs.Count); Assert.AreEqual(screen.TabSpaces, screen.Lines[0].Text.Length); // 0\t // 12 screen = new DynamicScreen(4); vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes($"0\t12")); Assert.AreEqual(1, screen.NumLines); Assert.AreEqual(2, screen.Lines.Count); Assert.AreEqual(2, screen.Lines[0].Runs.Count); Assert.AreEqual(screen.TabSpaces, screen.Lines[0].Text.Length); // 01\t // 2 screen = new DynamicScreen(4); vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes($"01\t2")); Assert.AreEqual(1, screen.NumLines); Assert.AreEqual(2, screen.Lines.Count); Assert.AreEqual(2, screen.Lines[0].Runs.Count); Assert.AreEqual(screen.TabSpaces, screen.Lines[0].Text.Length); // 0123 // \t screen = new DynamicScreen(4); vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes($"0123\t")); Assert.AreEqual(1, screen.NumLines); Assert.AreEqual(2, screen.Lines.Count); Assert.AreEqual(1, screen.Lines[0].Runs.Count); Assert.AreEqual(1, screen.Lines[1].Runs.Count); Assert.AreEqual(screen.TabSpaces, screen.Lines[0].Text.Length); // 0123 // 4\t screen = new DynamicScreen(4); vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes($"01234\t")); Assert.AreEqual(1, screen.NumLines); Assert.AreEqual(2, screen.Lines.Count); Assert.AreEqual(1, screen.Lines[0].Runs.Count); Assert.AreEqual(1, screen.Lines[0].Runs.Count); Assert.AreEqual(4, screen.Lines[0].Text.Length); Assert.AreEqual(screen.TabSpaces, screen.Lines[1].Text.Length); // Odd TabSpaces screen = new DynamicScreen(3); screen.TabSpaces = 3; vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes("\t")); Assert.AreEqual(1, screen.NumLines); Assert.AreEqual(1, screen.Lines.Count); Assert.AreEqual(1, screen.Lines[0].Runs.Count); Assert.AreEqual(screen.TabSpaces, screen.Lines[0].Text.Length); screen = new DynamicScreen(3); screen.TabSpaces = 3; vt100.Subscribe(screen); vt100.Input(Encoding.UTF8.GetBytes($"023\t")); Assert.AreEqual(1, screen.NumLines); Assert.AreEqual(2, screen.Lines.Count); Assert.AreEqual(1, screen.Lines[0].Runs.Count); Assert.AreEqual(screen.TabSpaces, screen.Lines[0].Text.Length); }
static int Main(string[] args) { string inputFilename = null; string outputFilename = null; int width = 80; int height = 25; string fontName = "Courier New"; int fontSize = 6; string encoding = "ibm437"; for (int i = 0; i < args.Length; i++) { switch (args[i]) { case "-w": i++; width = Int32.Parse(args[i]); break; case "-h": i++; height = Int32.Parse(args[i]); break; case "-f": i++; fontName = args[i]; break; case "-s": i++; fontSize = Int32.Parse(args[i]); break; case "-e": i++; encoding = args[i]; break; default: if (inputFilename == null) { inputFilename = args[i]; } else if (outputFilename == null) { outputFilename = args[i]; } else { System.Console.WriteLine("Unrecognized command line parameter ({0}): {1}", i, args[i]); } break; } } if (inputFilename == null || outputFilename == null) { System.Console.WriteLine("Syntax:"); System.Console.WriteLine(" {0} [-w width] [-h height] [-f fontName] [-s fontSize] [-e encoding] <input.txt> <output.png>", System.Reflection.Assembly.GetCallingAssembly().GetName().Name); return(-1); } IAnsiDecoder vt100 = new AnsiDecoder(); Screen screen = new Screen(width, height); vt100.Encoding = Encoding.GetEncoding(encoding); vt100.Subscribe(screen); using (Stream stream = File.Open(inputFilename, FileMode.Open)) { int read = 0; while ((read = stream.ReadByte()) != -1) { vt100.Input(new byte[] { (byte)read }); } } Bitmap bitmap = screen.ToBitmap(new Font(fontName, fontSize)); bitmap.Save(outputFilename, System.Drawing.Imaging.ImageFormat.Png); return(0); }