.NET Console TextWriter that Understands Indent/Unindent/IndentLevel

后端 未结 3 1691
清酒与你
清酒与你 2020-12-02 00:47

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.

相关标签:
3条回答
  • 2020-12-02 01:13

    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();
        }
    
    0 讨论(0)
  • 2020-12-02 01:26

    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();
        }
    }
    
    0 讨论(0)
  • 2020-12-02 01:30

    I usually just do something like this (within my app class):

    static TextWriter tw;
    static int indentLevel = 0;
    
    static void Indend()
    {
        indentLevel++;
    }
    
    static void Outdent()
    {
        indentLevel--;
    }
    
    static void WriteLine(string s)
    {
        tw.WriteLine(new string('\t', indentLevel) + s);
    }
    
    static void WriteLine()
    {
        tw.WriteLine();
    }
    

    and then e.g.

    using (tw = new StreamWriter(outputName))
    {
        WriteLine(string.Format("namespace {0}", nameSpace));
        WriteLine("{");
    
        Indend();
    
        foreach (string s in dataSourceItems)
            GenerateProc(s);
    
        Outdent();
    
        WriteLine("}");
    }
    

    You can obviously encapsulate this in a separate class if you like.

    0 讨论(0)
提交回复
热议问题