A game about forced loneliness, made by TACStudios
1using System.Text; 2using System.IO; 3using UnityEngine; 4 5namespace Unity.PerformanceTesting.Benchmark 6{ 7 internal class MarkdownBuilder 8 { 9 StringBuilder sb = new StringBuilder(32768); 10 int blockDepth = 0; 11 12 void Prefix() 13 { 14 if (blockDepth == 0) 15 return; 16 int len = sb.Length; 17 if (len == 0 || sb[len - 1] == '\n') 18 sb.Append($"{new string('>', blockDepth)} "); 19 } 20 21 MarkdownBuilder EnsureBlankLine() 22 { 23 int len = sb.Length; 24 if ((len > 0 && sb[len - 1] != '\n')) 25 Br().Br(); 26 else if (len > 1 && sb[len - 2] != '\n') 27 Br(); 28 return this; 29 } 30 31 public MarkdownBuilder Append(string text) 32 { 33 Prefix(); 34 sb.Append(text); 35 return this; 36 } 37 38 public MarkdownBuilder AppendLine(string text) => Append(text.TrimEnd('\n')).BrParagraph().Br(); 39 public MarkdownBuilder AppendLines(string[] lines) 40 { 41 foreach (string line in lines) 42 AppendLine(line); 43 return this; 44 } 45 public MarkdownBuilder AppendLines(string line, params string[] optLines) 46 { 47 AppendLine(line); 48 return AppendLines(optLines); 49 } 50 public MarkdownBuilder Header(int level, string text) => EnsureBlankLine().Append($"{new string('#', Mathf.Clamp(level, 1, 6))} {text}").Br().Br(); 51 public MarkdownBuilder HorizontalLine() => EnsureBlankLine().Append("---").Br(); 52 public MarkdownBuilder Br() => Append("\n"); 53 public MarkdownBuilder BrParagraph() => Append("<br/>"); 54 public MarkdownBuilder Italic(string text) => Append($"*{text}*"); 55 public MarkdownBuilder Bold(string text) => Append($"**{text}**"); 56 public MarkdownBuilder BoldItalic(string text) => Append($"***{text}***"); 57 public MarkdownBuilder Code(string text) => Append($"`{text}`"); 58 public MarkdownBuilder Link(string url) => Append($"<{url}>"); 59 public MarkdownBuilder Link(string url, string name) => Append($"[{name}]({url.Replace(" ", "%20")})"); 60 public MarkdownBuilder Link(string url, string name, string tooltip) => Append($"[{name}]({url} \"{tooltip}\")"); 61 public MarkdownBuilder LinkHeader(string headerName) => Append($"[{headerName}](#{headerName.Replace(" ", "-").ToLower()})"); 62 public MarkdownBuilder ListItem(int zeroBasedDepth) => Append($"{new string(' ', Mathf.Clamp(zeroBasedDepth * 2, 0, 6))}- "); 63 public MarkdownBuilder ListItem(int zeroBasedDepth, string text) => Append($"{new string(' ', Mathf.Clamp(zeroBasedDepth * 2, 0, 6))}- {text}").Br(); 64 65 public MarkdownBuilder BeginBlock() 66 { 67 EnsureBlankLine(); // *before* increasing block depth 68 blockDepth++; 69 return this; 70 } 71 72 public MarkdownBuilder EndBlock() 73 { 74 if (blockDepth > 0) 75 blockDepth--; 76 return EnsureBlankLine(); // *after* decreasing block depth 77 } 78 79 public MarkdownBuilder TableHeader(bool alignRightFirst, string columnName, bool alignRightOthers, params string[] optColumnNames) 80 { 81 EnsureBlankLine(); 82 TableRow(columnName, optColumnNames); 83 if (alignRightFirst) 84 Append("|--:|"); 85 else 86 Append("|---|"); 87 for (int i = 0; i < optColumnNames.Length; i++) 88 { 89 if (alignRightOthers) 90 Append($"--:|"); 91 else 92 Append($"---|"); 93 } 94 return Br(); 95 } 96 97 public MarkdownBuilder TableRow(string columnData, params string[] optColumnData) 98 { 99 Append($"| {columnData} |"); 100 for (int i = 0; i < optColumnData.Length; i++) 101 Append($" {optColumnData[i]} |"); 102 return Br(); 103 } 104 105 public MarkdownBuilder Note(string title, string descLine, params string[] optDescLines) => BeginBlock().Bold(title).Br().Br().AppendLines(descLine, optDescLines).EndBlock(); 106 public MarkdownBuilder Note(string title, string[] descLines) => BeginBlock().Bold(title).Br().Br().AppendLines(descLines).EndBlock(); 107 public MarkdownBuilder Note(string[] descLines) => BeginBlock().AppendLines(descLines).EndBlock(); 108 109 public override string ToString() => sb.ToString(); 110 public void Save(string path) => File.WriteAllText(path, ToString()); 111 } 112 113}