コード例 #1
0
 public override void GetClassificationSpans(List <HexClassificationSpan> result, HexClassificationContext context)
 {
 }
コード例 #2
0
        void GetClassificationSpansCore(List <HexClassificationSpan> result, HexClassificationContext context, CancellationToken?cancellationToken)
        {
            if (context.IsDefault)
            {
                throw new ArgumentException();
            }
            var textSpan = context.LineSpan;
            var list     = new List <HexClassificationSpan>();

            var taggerContext = new HexTaggerContext(context.Line, context.LineSpan);
            var tags          = cancellationToken != null?hexTagAggregator.GetAllTags(taggerContext, cancellationToken.Value) : hexTagAggregator.GetAllTags(taggerContext);

            foreach (var tagSpan in tags)
            {
                var overlap = textSpan.Overlap(tagSpan.Span);
                if (overlap != null)
                {
                    list.Add(new HexClassificationSpan(overlap.Value, tagSpan.Tag.ClassificationType));
                }
            }

            if (list.Count <= 1)
            {
                if (list.Count == 1)
                {
                    result.Add(list[0]);
                }
                return;
            }

            list.Sort(HexClassificationSpanComparer.Instance);

            // Common case
            if (!HasOverlaps(list))
            {
                result.AddRange(Merge(list));
                return;
            }

            int min       = 0;
            int minOffset = textSpan.Start;
            var newList   = new List <HexClassificationSpan>();
            var ctList    = new List <VSTC.IClassificationType>();

            while (min < list.Count)
            {
                while (min < list.Count && minOffset >= list[min].Span.End)
                {
                    min++;
                }
                if (min >= list.Count)
                {
                    break;
                }
                var cspan = list[min];
                minOffset = Math.Max(minOffset, cspan.Span.Start);
                int end = cspan.Span.End;
                ctList.Clear();
                ctList.Add(cspan.ClassificationType);
                for (int i = min + 1; i < list.Count; i++)
                {
                    cspan = list[i];
                    int cspanStart = cspan.Span.Start;
                    if (cspanStart > minOffset)
                    {
                        if (cspanStart < end)
                        {
                            end = cspanStart;
                        }
                        break;
                    }
                    int cspanEnd = cspan.Span.End;
                    if (minOffset >= cspanEnd)
                    {
                        continue;
                    }
                    if (cspanEnd < end)
                    {
                        end = cspanEnd;
                    }
                    if (!ctList.Contains(cspan.ClassificationType))
                    {
                        ctList.Add(cspan.ClassificationType);
                    }
                }
                Debug.Assert(minOffset < end);
                var ct = ctList.Count == 1 ? ctList[0] : classificationTypeRegistryService.CreateTransientClassificationType(ctList);
                newList.Add(new HexClassificationSpan(VST.Span.FromBounds(minOffset, end), ct));
                minOffset = end;
            }

            Debug.Assert(!HasOverlaps(newList));
            result.AddRange(Merge(newList));
            return;
        }
コード例 #3
0
 public override void GetClassificationSpans(List <HexClassificationSpan> result, HexClassificationContext context) =>
 GetClassificationSpansCore(result, context, null);
コード例 #4
0
 public override void GetClassificationSpans(List <HexClassificationSpan> result, HexClassificationContext context, CancellationToken cancellationToken) =>
 GetClassificationSpansCore(result, context, cancellationToken);
コード例 #5
0
        public void Add(HexBufferLineFormatter bufferLines, HexClassifier classifier, NormalizedHexBufferSpanCollection spans, CancellationToken cancellationToken)
        {
            if (bufferLines == null)
            {
                throw new ArgumentNullException(nameof(bufferLines));
            }
            if (classifier == null)
            {
                throw new ArgumentNullException(nameof(classifier));
            }
            if (spans == null)
            {
                throw new ArgumentNullException(nameof(spans));
            }
            if (spans.Count != 0 && spans[0].Buffer != bufferLines.Buffer)
            {
                throw new ArgumentException();
            }

            var classificationSpans = new List <HexClassificationSpan>();

            foreach (var span in spans)
            {
                if (spansCount > 0)
                {
                    htmlWriter.WriteRaw(delimiter);
                }
                spansCount++;

                var pos = span.Start;
                for (;;)
                {
                    classificationSpans.Clear();
                    var line    = bufferLines.GetLineFromPosition(pos);
                    var text    = line.GetText(span);
                    var context = new HexClassificationContext(line, line.TextSpan);
                    classifier.GetClassificationSpans(classificationSpans, context, cancellationToken);

                    int textPos = 0;
                    foreach (var tagSpan in classificationSpans)
                    {
                        if (textPos < tagSpan.Span.Start)
                        {
                            WriteCss(classificationFormatMap.DefaultTextProperties);
                            htmlWriter.WriteSpan(cssWriter.ToString(), text, textPos, tagSpan.Span.Start - textPos);
                        }
                        WriteCss(classificationFormatMap.GetTextProperties(tagSpan.ClassificationType));
                        htmlWriter.WriteSpan(cssWriter.ToString(), text, tagSpan.Span.Start, tagSpan.Span.Length);
                        textPos = tagSpan.Span.End;
                    }
                    if (textPos < text.Length)
                    {
                        WriteCss(classificationFormatMap.DefaultTextProperties);
                        htmlWriter.WriteSpan(cssWriter.ToString(), text, textPos, text.Length - textPos);
                    }
                    htmlWriter.WriteRaw("<br/>");

                    pos = line.BufferEnd;
                    if (pos >= span.End)
                    {
                        break;
                    }
                }
            }
        }