Represent a mapping between primary (view) buffer and the contained (projected) language
Inheritance: Microsoft.Languages.Core.Text.TextRange
Example #1
0
        private List <object> CreateSecondarySpans(string secondaryText, IReadOnlyList <ProjectionMapping> mappings)
        {
            var spans = new List <object>(mappings.Count);

            int  secondaryIndex = 0;
            Span span;

            for (int i = 0; i < mappings.Count; i++)
            {
                ProjectionMapping mapping = mappings[i];
                if (mapping.Length > 0)
                {
                    span = Span.FromBounds(secondaryIndex, mapping.ProjectionRange.Start);
                    if (!span.IsEmpty)
                    {
                        spans.Add(secondaryText.Substring(span.Start, span.Length)); // inert
                    }
                    span = new Span(mapping.SourceStart, mapping.Length);
                    // Active span comes from the disk buffer
                    spans.Add(new CustomTrackingSpan(DiskBuffer.CurrentSnapshot, span, PointTrackingMode.Positive, PointTrackingMode.Positive)); // active
                    secondaryIndex = mapping.ProjectionRange.End;
                }
            }

            // Add the final inert text after the last span
            span = Span.FromBounds(secondaryIndex, secondaryText.Length);
            if (!span.IsEmpty)
            {
                spans.Add(secondaryText.Substring(span.Start, span.Length)); // inert
            }
            return(spans);
        }
Example #2
0
        private List <object> CreateViewSpans(IReadOnlyList <ProjectionMapping> mappings)
        {
            var  spans        = new List <object>(mappings.Count);
            var  diskSnapshot = DiskBuffer.CurrentSnapshot;
            int  primaryIndex = 0;
            Span span;

            for (int i = 0; i < mappings.Count; i++)
            {
                ProjectionMapping mapping = mappings[i];
                if (mapping.Length > 0)
                {
                    span = Span.FromBounds(primaryIndex, mapping.SourceStart);
                    spans.Add(new CustomTrackingSpan(diskSnapshot, span, i == 0 ? PointTrackingMode.Negative : PointTrackingMode.Positive, PointTrackingMode.Positive)); // Markdown
                    primaryIndex = mapping.SourceRange.End;

                    span = new Span(mapping.ProjectionStart, mapping.Length);
                    spans.Add(new CustomTrackingSpan(ContainedLanguageBuffer.CurrentSnapshot, span, PointTrackingMode.Positive, PointTrackingMode.Positive)); // R
                }
            }
            // Add the final section after the last span
            span = Span.FromBounds(primaryIndex, diskSnapshot.Length);
            if (!span.IsEmpty)
            {
                spans.Add(new CustomTrackingSpan(diskSnapshot, span, PointTrackingMode.Positive, PointTrackingMode.Positive)); // Markdown
            }
            return(spans);
        }
Example #3
0
        public virtual string GenerateContent(ITextSnapshot snapshot, IEnumerable<ITextRange> languageBlocks, out ProjectionMapping[] mappings) {
            var mappingsList = new List<ProjectionMapping>();
            var secondaryIndex = 0;

            var sb = new StringBuilder();

            foreach (var b in languageBlocks) {
                var text = snapshot.GetText(b.Start, b.Length);
                secondaryIndex = sb.Length;

                sb.AppendLine(text);
                var m = new ProjectionMapping(b.Start, secondaryIndex, b.Length);
                mappingsList.Add(m);
            }

            mappings = mappingsList.ToArray();
            return sb.ToString();
        }