No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MarkdownBuilder.cs 4.5KB

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