Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

.NET Console TextWriter that Understands Indent/Unindent/IndentLevel

Does anybody have or know of a TextWriter for the Console that understand how to indent/unindent and has the ability to set the indent level.

like image 247
AMissico Avatar asked Mar 30 '10 17:03

AMissico


2 Answers

System.CodeDom.Compiler.IndentedTextWriter

This is built in to the .Net Framework in system.dll, but it is not super-robust. It should work under constrained useage (like not having a newline character in a string).

    static void Main(string[] args)
    {
        using (System.CodeDom.Compiler.IndentedTextWriter writer = new System.CodeDom.Compiler.IndentedTextWriter(Console.Out, "    "))
        {
            Console.SetOut(writer);
            writer.Indent = 0;
            writer.WriteLine("test");
            writer.Indent = 1;
            writer.WriteLine("What happens\nif there are line-\nbreak in the middle?");
            writer.Indent = 2;
            writer.WriteLine("another test");
            writer.Indent = 3;
            writer.WriteLine("and another test");
            writer.Indent = 0;
            writer.WriteLine("hello");
        }
        Console.ReadLine();
    }
like image 110
Jeffrey L Whitledge Avatar answered Nov 09 '22 19:11

Jeffrey L Whitledge


Try this:

class MyConsole : TextWriter {
    TextWriter mOldConsole;
    bool mDoIndent;

    public MyConsole() {
        mOldConsole = Console.Out;
        Console.SetOut(this);
    }

    public int Indent { get; set; }

    public override void Write(char ch) {
        if (mDoIndent) {
            mDoIndent = false;
            for (int ix = 0; ix < Indent; ++ix) mOldConsole.Write("  ");
        }
        mOldConsole.Write(ch);
        if (ch == '\n') mDoIndent = true;
    }

    public override System.Text.Encoding Encoding {
        get { return mOldConsole.Encoding; }
    }
}

Sample usage:

class Program {
    static MyConsole Output = new MyConsole();
    static void Main(string[] args) {
        Console.WriteLine("Hello");
        Output.Indent++;
        Console.WriteLine("world");
        Output.Indent--;
        Console.WriteLine("Back");
        Console.ReadLine();
    }
}
like image 27
Hans Passant Avatar answered Nov 09 '22 19:11

Hans Passant