using System;
using System.Text;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
new Test1().Main();
}
}
public class Test1
{
void Show(string res) {
var resWrapped = "\"" + res.Replace("\n", "⏎\n").Replace(" ", "·").Replace("\t", "↹") + "\"";
Console.WriteLine(resWrapped);
Console.WriteLine();
}
public void Main()
{
var indentAmount = 4;
Show(Indent("", indentAmount));
Show(Indent(@"
", indentAmount));
Show(Indent(@"line1
line2
line4hasATrailingSpace (line3wasEmpty)
line5beginsWithExtraIndenation
line8isHere (line6wasEmpty and line7hadOnlySpaces)
line9hasEndOfString", indentAmount));
}
string IndentWhoIsRich(string textToIndent, int indentAmount = 1, char indentChar = ' ')
{
var indent = new string(indentChar, indentAmount);
return indent + textToIndent.Replace("\n", "\n" + indent);
}
string IndentStakx(string str, int count = 1, char indentChar = ' ')
{
var indented = new StringBuilder();
var i = 0;
while (i < str.Length)
{
indented.Append(indentChar, count);
var j = str.IndexOf('\n', i + 1);
if (j > i)
{
indented.Append(str, i, j - i + 1);
i = j + 1;
}
else
{
break;
}
}
indented.Append(str, i, str.Length - i);
return indented.ToString();
}
string IndentMD1(string textToIndent, int indentAmount = 1, char indentChar = ' ')
{
var splittedText = textToIndent.Split(new string[] {Environment.NewLine}, StringSplitOptions.None);
var indent = new string(indentChar, indentAmount);
var sb = new StringBuilder();
foreach (var line in splittedText) {
sb.Append(indent);
sb.AppendLine(line);
}
return sb.ToString();
}
Regex regexForReplace = new Regex(@"(\n)(?!([\r\n]|$))");
Regex regexForFirst = new Regex(@"^([\r\n]|$)");
string Indent(string textToIndent, int indentAmount = 1, char indentChar = ' ')
{
var indent = new string(indentChar, indentAmount);
string firstIndent = regexForFirst.IsMatch(textToIndent) ? "" : indent;
return firstIndent + regexForReplace.Replace(textToIndent, @"$1" + indent);
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGV4dDsKdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwoKcHVibGljIGNsYXNzIFRlc3QKewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCW5ldyBUZXN0MSgpLk1haW4oKTsKCX0KfQoKcHVibGljIGNsYXNzIFRlc3QxCnsKCXZvaWQgU2hvdyhzdHJpbmcgcmVzKSB7CgkJdmFyIHJlc1dyYXBwZWQgPSAiXCIiICsgcmVzLlJlcGxhY2UoIlxuIiwgIuKPjlxuIikuUmVwbGFjZSgiICIsICLCtyIpLlJlcGxhY2UoIlx0IiwgIuKGuSIpICsgIlwiIjsKCQlDb25zb2xlLldyaXRlTGluZShyZXNXcmFwcGVkKTsKCQlDb25zb2xlLldyaXRlTGluZSgpOwoJfQoJCglwdWJsaWMgdm9pZCBNYWluKCkKCXsKCQl2YXIgaW5kZW50QW1vdW50ID0gNDsKCQlTaG93KEluZGVudCgiIiwgaW5kZW50QW1vdW50KSk7CgkJU2hvdyhJbmRlbnQoQCIKIiwgaW5kZW50QW1vdW50KSk7CgkJU2hvdyhJbmRlbnQoQCJsaW5lMQpsaW5lMgoKbGluZTRoYXNBVHJhaWxpbmdTcGFjZSAobGluZTN3YXNFbXB0eSkgCiAgbGluZTViZWdpbnNXaXRoRXh0cmFJbmRlbmF0aW9uCgogIApsaW5lOGlzSGVyZSAobGluZTZ3YXNFbXB0eSBhbmQgbGluZTdoYWRPbmx5U3BhY2VzKQpsaW5lOWhhc0VuZE9mU3RyaW5nIiwgaW5kZW50QW1vdW50KSk7Cgl9CgkKCXN0cmluZyBJbmRlbnRXaG9Jc1JpY2goc3RyaW5nIHRleHRUb0luZGVudCwgaW50IGluZGVudEFtb3VudCA9IDEsIGNoYXIgaW5kZW50Q2hhciA9ICcgJykKCXsKCQl2YXIgaW5kZW50ID0gbmV3IHN0cmluZyhpbmRlbnRDaGFyLCBpbmRlbnRBbW91bnQpOwoJCXJldHVybiBpbmRlbnQgKyB0ZXh0VG9JbmRlbnQuUmVwbGFjZSgiXG4iLCAiXG4iICsgaW5kZW50KTsKCX0KCQoJc3RyaW5nIEluZGVudFN0YWt4KHN0cmluZyBzdHIsIGludCBjb3VudCA9IDEsIGNoYXIgaW5kZW50Q2hhciA9ICcgJykKCXsKCSAgICB2YXIgaW5kZW50ZWQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwoJICAgIHZhciBpID0gMDsKCSAgICB3aGlsZSAoaSA8IHN0ci5MZW5ndGgpCgkgICAgewoJICAgICAgICBpbmRlbnRlZC5BcHBlbmQoaW5kZW50Q2hhciwgY291bnQpOwoJICAgICAgICB2YXIgaiA9IHN0ci5JbmRleE9mKCdcbicsIGkgKyAxKTsKCSAgICAgICAgaWYgKGogPiBpKQoJICAgICAgICB7CgkgICAgICAgICAgICBpbmRlbnRlZC5BcHBlbmQoc3RyLCBpLCBqIC0gaSArIDEpOwoJICAgICAgICAgICAgaSA9IGogKyAxOwoJICAgICAgICB9CgkgICAgICAgIGVsc2UKCSAgICAgICAgewoJICAgICAgICAgICAgYnJlYWs7CgkgICAgICAgIH0KCSAgICB9CgkgICAgaW5kZW50ZWQuQXBwZW5kKHN0ciwgaSwgc3RyLkxlbmd0aCAtIGkpOwoJICAgIHJldHVybiBpbmRlbnRlZC5Ub1N0cmluZygpOwoJfQoJCglzdHJpbmcgSW5kZW50TUQxKHN0cmluZyB0ZXh0VG9JbmRlbnQsIGludCBpbmRlbnRBbW91bnQgPSAxLCBjaGFyIGluZGVudENoYXIgPSAnICcpCgl7CgkgICAgdmFyIHNwbGl0dGVkVGV4dCA9IHRleHRUb0luZGVudC5TcGxpdChuZXcgc3RyaW5nW10ge0Vudmlyb25tZW50Lk5ld0xpbmV9LCBTdHJpbmdTcGxpdE9wdGlvbnMuTm9uZSk7CgkJdmFyIGluZGVudCA9IG5ldyBzdHJpbmcoaW5kZW50Q2hhciwgaW5kZW50QW1vdW50KTsKCQl2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwoJCWZvcmVhY2ggKHZhciBsaW5lIGluIHNwbGl0dGVkVGV4dCkgewoJCSAgICBzYi5BcHBlbmQoaW5kZW50KTsKCQkgICAgc2IuQXBwZW5kTGluZShsaW5lKTsKCQl9CgkJcmV0dXJuIHNiLlRvU3RyaW5nKCk7Cgl9CgkKCVJlZ2V4IHJlZ2V4Rm9yUmVwbGFjZSA9IG5ldyBSZWdleChAIihcbikoPyEoW1xyXG5dfCQpKSIpOwoJUmVnZXggcmVnZXhGb3JGaXJzdCA9IG5ldyBSZWdleChAIl4oW1xyXG5dfCQpIik7CgkKCXN0cmluZyBJbmRlbnQoc3RyaW5nIHRleHRUb0luZGVudCwgaW50IGluZGVudEFtb3VudCA9IDEsIGNoYXIgaW5kZW50Q2hhciA9ICcgJykKCXsKCQl2YXIgaW5kZW50ID0gbmV3IHN0cmluZyhpbmRlbnRDaGFyLCBpbmRlbnRBbW91bnQpOwoJCXN0cmluZyBmaXJzdEluZGVudCA9IHJlZ2V4Rm9yRmlyc3QuSXNNYXRjaCh0ZXh0VG9JbmRlbnQpID8gIiIgOiBpbmRlbnQ7CgkgICAgcmV0dXJuIGZpcnN0SW5kZW50ICsgcmVnZXhGb3JSZXBsYWNlLlJlcGxhY2UodGV4dFRvSW5kZW50LCBAIiQxIiArIGluZGVudCk7Cgl9Cgp9