123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- using System.Collections.Generic;
- using System.Text;
- using System.Linq;
-
- using Unity.PlasticSCM.Editor.UI;
-
- namespace Unity.PlasticSCM.Editor.Help
- {
- internal class FormattedHelpLink
- {
- internal HelpLink Source;
- internal int Position;
- internal int Length;
- }
-
- internal static class BuildFormattedHelp
- {
- internal static void ForData(
- string plainText,
- HelpFormat[] formattedBlocks,
- HelpLink[] links,
- out string formattedHelpText,
- out List<FormattedHelpLink> formattedLinks)
- {
- formattedHelpText = string.Empty;
- formattedLinks = new List<FormattedHelpLink>();
-
- List<object> segments = new List<object>();
- segments.AddRange(formattedBlocks);
- segments.AddRange(links);
- var sortedSegments = segments.OrderBy(
- n => n is HelpFormat ?
- ((HelpFormat)n).Position :
- ((HelpLink)n).Position);
-
- StringBuilder sb = new StringBuilder();
-
- int lastIndex = 0;
- foreach (var segment in sortedSegments)
- {
- Segment.Data segmentData = GetSegmentData(segment);
-
- if (segmentData.Begin > lastIndex)
- sb.Append(plainText.Substring(lastIndex, segmentData.Begin - lastIndex));
-
- string plainSegment = plainText.Substring(
- segmentData.Begin, segmentData.Length);
-
- if (segment is HelpLink)
- {
- formattedLinks.Add(new FormattedHelpLink()
- {
- Source = (HelpLink)segment,
- Position = sb.Length,
- Length = segmentData.Prefix.Length +
- plainSegment.Length +
- segmentData.Suffix.Length
- });
- }
-
- sb.Append(segmentData.Prefix);
- sb.Append(plainSegment);
- sb.Append(segmentData.Suffix);
-
- lastIndex = segmentData.Begin + segmentData.Length;
- }
-
- sb.Append(plainText.Substring(lastIndex));
-
- formattedHelpText = sb.ToString();
- }
-
- internal static bool IsLinkMetaChar(
- FormattedHelpLink formattedLink,
- int charIndex)
- {
- int prefixEndIndex =
- formattedLink.Position +
- Segment.LINK_PREFIX.Length - 1;
-
- if (formattedLink.Position <= charIndex &&
- charIndex <= prefixEndIndex)
- return true;
-
- int suffixStartIndex =
- formattedLink.Position +
- formattedLink.Length - Segment.LINK_SUFFIX.Length;
-
- if (suffixStartIndex <= charIndex &&
- charIndex <= (formattedLink.Position + formattedLink.Length - 1))
- return true;
-
- return false;
- }
-
- static Segment.Data GetSegmentData(object segment)
- {
- if (segment is HelpLink)
- {
- HelpLink link = (HelpLink)segment;
- return Segment.BuildForLink(link);
- }
-
- HelpFormat format = (HelpFormat)segment;
- return Segment.BuildForFormat(format);
- }
-
- static class Segment
- {
- internal class Data
- {
- internal int Begin;
- internal int Length;
- internal string Prefix;
- internal string Suffix;
- }
-
- internal static Data BuildForLink(HelpLink link)
- {
- return new Data()
- {
- Begin = link.Position,
- Length = link.Length,
- Prefix = LINK_PREFIX,
- Suffix = LINK_SUFFIX
- };
- }
-
- internal static Data BuildForFormat(HelpFormat format)
- {
- switch (format.Type)
- {
- case HelpFormat.FormatType.Title:
- return new Data()
- {
- Begin = format.Position,
- Length = format.Length,
- Prefix = TITLE_PREFIX,
- Suffix = TITLE_SUFFIX
- };
- case HelpFormat.FormatType.Bold:
- return new Data()
- {
- Begin = format.Position,
- Length = format.Length,
- Prefix = BOLD_PREFIX,
- Suffix = BOLD_SUFFIX
- };
- case HelpFormat.FormatType.Underline:
- // NOTE(rafa): No support yet for underline, we use italic instead
- return new Data()
- {
- Begin = format.Position,
- Length = format.Length,
- Prefix = ITALIC_PREFIX,
- Suffix = ITALIC_SUFFIX
- };
- default:
- return null;
- }
- }
-
- internal const string LINK_PREFIX = "<color=\"" + UnityStyles.HexColors.LINK_COLOR + "\">";
- internal const string LINK_SUFFIX = "</color>";
- const string TITLE_PREFIX = "<size=16>";
- const string TITLE_SUFFIX = "</size>";
- const string BOLD_PREFIX = "<b>";
- const string BOLD_SUFFIX = "</b>";
- const string ITALIC_PREFIX = "<i>";
- const string ITALIC_SUFFIX = "</i>";
- }
- }
- }
|