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}