114 lines
4.5 KiB
C#
114 lines
4.5 KiB
C#
|
using System.Text;
|
||
|
using System.IO;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace Unity.PerformanceTesting.Benchmark
|
||
|
{
|
||
|
internal class MarkdownBuilder
|
||
|
{
|
||
|
StringBuilder sb = new StringBuilder(32768);
|
||
|
int blockDepth = 0;
|
||
|
|
||
|
void Prefix()
|
||
|
{
|
||
|
if (blockDepth == 0)
|
||
|
return;
|
||
|
int len = sb.Length;
|
||
|
if (len == 0 || sb[len - 1] == '\n')
|
||
|
sb.Append($"{new string('>', blockDepth)} ");
|
||
|
}
|
||
|
|
||
|
MarkdownBuilder EnsureBlankLine()
|
||
|
{
|
||
|
int len = sb.Length;
|
||
|
if ((len > 0 && sb[len - 1] != '\n'))
|
||
|
Br().Br();
|
||
|
else if (len > 1 && sb[len - 2] != '\n')
|
||
|
Br();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
public MarkdownBuilder Append(string text)
|
||
|
{
|
||
|
Prefix();
|
||
|
sb.Append(text);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
public MarkdownBuilder AppendLine(string text) => Append(text.TrimEnd('\n')).BrParagraph().Br();
|
||
|
public MarkdownBuilder AppendLines(string[] lines)
|
||
|
{
|
||
|
foreach (string line in lines)
|
||
|
AppendLine(line);
|
||
|
return this;
|
||
|
}
|
||
|
public MarkdownBuilder AppendLines(string line, params string[] optLines)
|
||
|
{
|
||
|
AppendLine(line);
|
||
|
return AppendLines(optLines);
|
||
|
}
|
||
|
public MarkdownBuilder Header(int level, string text) => EnsureBlankLine().Append($"{new string('#', Mathf.Clamp(level, 1, 6))} {text}").Br().Br();
|
||
|
public MarkdownBuilder HorizontalLine() => EnsureBlankLine().Append("---").Br();
|
||
|
public MarkdownBuilder Br() => Append("\n");
|
||
|
public MarkdownBuilder BrParagraph() => Append("<br/>");
|
||
|
public MarkdownBuilder Italic(string text) => Append($"*{text}*");
|
||
|
public MarkdownBuilder Bold(string text) => Append($"**{text}**");
|
||
|
public MarkdownBuilder BoldItalic(string text) => Append($"***{text}***");
|
||
|
public MarkdownBuilder Code(string text) => Append($"`{text}`");
|
||
|
public MarkdownBuilder Link(string url) => Append($"<{url}>");
|
||
|
public MarkdownBuilder Link(string url, string name) => Append($"[{name}]({url.Replace(" ", "%20")})");
|
||
|
public MarkdownBuilder Link(string url, string name, string tooltip) => Append($"[{name}]({url} \"{tooltip}\")");
|
||
|
public MarkdownBuilder LinkHeader(string headerName) => Append($"[{headerName}](#{headerName.Replace(" ", "-").ToLower()})");
|
||
|
public MarkdownBuilder ListItem(int zeroBasedDepth) => Append($"{new string(' ', Mathf.Clamp(zeroBasedDepth * 2, 0, 6))}- ");
|
||
|
public MarkdownBuilder ListItem(int zeroBasedDepth, string text) => Append($"{new string(' ', Mathf.Clamp(zeroBasedDepth * 2, 0, 6))}- {text}").Br();
|
||
|
|
||
|
public MarkdownBuilder BeginBlock()
|
||
|
{
|
||
|
EnsureBlankLine(); // *before* increasing block depth
|
||
|
blockDepth++;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
public MarkdownBuilder EndBlock()
|
||
|
{
|
||
|
if (blockDepth > 0)
|
||
|
blockDepth--;
|
||
|
return EnsureBlankLine(); // *after* decreasing block depth
|
||
|
}
|
||
|
|
||
|
public MarkdownBuilder TableHeader(bool alignRightFirst, string columnName, bool alignRightOthers, params string[] optColumnNames)
|
||
|
{
|
||
|
EnsureBlankLine();
|
||
|
TableRow(columnName, optColumnNames);
|
||
|
if (alignRightFirst)
|
||
|
Append("|--:|");
|
||
|
else
|
||
|
Append("|---|");
|
||
|
for (int i = 0; i < optColumnNames.Length; i++)
|
||
|
{
|
||
|
if (alignRightOthers)
|
||
|
Append($"--:|");
|
||
|
else
|
||
|
Append($"---|");
|
||
|
}
|
||
|
return Br();
|
||
|
}
|
||
|
|
||
|
public MarkdownBuilder TableRow(string columnData, params string[] optColumnData)
|
||
|
{
|
||
|
Append($"| {columnData} |");
|
||
|
for (int i = 0; i < optColumnData.Length; i++)
|
||
|
Append($" {optColumnData[i]} |");
|
||
|
return Br();
|
||
|
}
|
||
|
|
||
|
public MarkdownBuilder Note(string title, string descLine, params string[] optDescLines) => BeginBlock().Bold(title).Br().Br().AppendLines(descLine, optDescLines).EndBlock();
|
||
|
public MarkdownBuilder Note(string title, string[] descLines) => BeginBlock().Bold(title).Br().Br().AppendLines(descLines).EndBlock();
|
||
|
public MarkdownBuilder Note(string[] descLines) => BeginBlock().AppendLines(descLines).EndBlock();
|
||
|
|
||
|
public override string ToString() => sb.ToString();
|
||
|
public void Save(string path) => File.WriteAllText(path, ToString());
|
||
|
}
|
||
|
|
||
|
}
|