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.

BuildFormattedHelp.cs 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. using System.Collections.Generic;
  2. using System.Text;
  3. using System.Linq;
  4. using Unity.PlasticSCM.Editor.UI;
  5. namespace Unity.PlasticSCM.Editor.Help
  6. {
  7. internal class FormattedHelpLink
  8. {
  9. internal HelpLink Source;
  10. internal int Position;
  11. internal int Length;
  12. }
  13. internal static class BuildFormattedHelp
  14. {
  15. internal static void ForData(
  16. string plainText,
  17. HelpFormat[] formattedBlocks,
  18. HelpLink[] links,
  19. out string formattedHelpText,
  20. out List<FormattedHelpLink> formattedLinks)
  21. {
  22. formattedHelpText = string.Empty;
  23. formattedLinks = new List<FormattedHelpLink>();
  24. List<object> segments = new List<object>();
  25. segments.AddRange(formattedBlocks);
  26. segments.AddRange(links);
  27. var sortedSegments = segments.OrderBy(
  28. n => n is HelpFormat ?
  29. ((HelpFormat)n).Position :
  30. ((HelpLink)n).Position);
  31. StringBuilder sb = new StringBuilder();
  32. int lastIndex = 0;
  33. foreach (var segment in sortedSegments)
  34. {
  35. Segment.Data segmentData = GetSegmentData(segment);
  36. if (segmentData.Begin > lastIndex)
  37. sb.Append(plainText.Substring(lastIndex, segmentData.Begin - lastIndex));
  38. string plainSegment = plainText.Substring(
  39. segmentData.Begin, segmentData.Length);
  40. if (segment is HelpLink)
  41. {
  42. formattedLinks.Add(new FormattedHelpLink()
  43. {
  44. Source = (HelpLink)segment,
  45. Position = sb.Length,
  46. Length = segmentData.Prefix.Length +
  47. plainSegment.Length +
  48. segmentData.Suffix.Length
  49. });
  50. }
  51. sb.Append(segmentData.Prefix);
  52. sb.Append(plainSegment);
  53. sb.Append(segmentData.Suffix);
  54. lastIndex = segmentData.Begin + segmentData.Length;
  55. }
  56. sb.Append(plainText.Substring(lastIndex));
  57. formattedHelpText = sb.ToString();
  58. }
  59. internal static bool IsLinkMetaChar(
  60. FormattedHelpLink formattedLink,
  61. int charIndex)
  62. {
  63. int prefixEndIndex =
  64. formattedLink.Position +
  65. Segment.LINK_PREFIX.Length - 1;
  66. if (formattedLink.Position <= charIndex &&
  67. charIndex <= prefixEndIndex)
  68. return true;
  69. int suffixStartIndex =
  70. formattedLink.Position +
  71. formattedLink.Length - Segment.LINK_SUFFIX.Length;
  72. if (suffixStartIndex <= charIndex &&
  73. charIndex <= (formattedLink.Position + formattedLink.Length - 1))
  74. return true;
  75. return false;
  76. }
  77. static Segment.Data GetSegmentData(object segment)
  78. {
  79. if (segment is HelpLink)
  80. {
  81. HelpLink link = (HelpLink)segment;
  82. return Segment.BuildForLink(link);
  83. }
  84. HelpFormat format = (HelpFormat)segment;
  85. return Segment.BuildForFormat(format);
  86. }
  87. static class Segment
  88. {
  89. internal class Data
  90. {
  91. internal int Begin;
  92. internal int Length;
  93. internal string Prefix;
  94. internal string Suffix;
  95. }
  96. internal static Data BuildForLink(HelpLink link)
  97. {
  98. return new Data()
  99. {
  100. Begin = link.Position,
  101. Length = link.Length,
  102. Prefix = LINK_PREFIX,
  103. Suffix = LINK_SUFFIX
  104. };
  105. }
  106. internal static Data BuildForFormat(HelpFormat format)
  107. {
  108. switch (format.Type)
  109. {
  110. case HelpFormat.FormatType.Title:
  111. return new Data()
  112. {
  113. Begin = format.Position,
  114. Length = format.Length,
  115. Prefix = TITLE_PREFIX,
  116. Suffix = TITLE_SUFFIX
  117. };
  118. case HelpFormat.FormatType.Bold:
  119. return new Data()
  120. {
  121. Begin = format.Position,
  122. Length = format.Length,
  123. Prefix = BOLD_PREFIX,
  124. Suffix = BOLD_SUFFIX
  125. };
  126. case HelpFormat.FormatType.Underline:
  127. // NOTE(rafa): No support yet for underline, we use italic instead
  128. return new Data()
  129. {
  130. Begin = format.Position,
  131. Length = format.Length,
  132. Prefix = ITALIC_PREFIX,
  133. Suffix = ITALIC_SUFFIX
  134. };
  135. default:
  136. return null;
  137. }
  138. }
  139. internal const string LINK_PREFIX = "<color=\"" + UnityStyles.HexColors.LINK_COLOR + "\">";
  140. internal const string LINK_SUFFIX = "</color>";
  141. const string TITLE_PREFIX = "<size=16>";
  142. const string TITLE_SUFFIX = "</size>";
  143. const string BOLD_PREFIX = "<b>";
  144. const string BOLD_SUFFIX = "</b>";
  145. const string ITALIC_PREFIX = "<i>";
  146. const string ITALIC_SUFFIX = "</i>";
  147. }
  148. }
  149. }