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()); | ||
|  |     } | ||
|  | 
 | ||
|  | } |