コード例 #1
0
        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            var ast = _abstractSyntaxTree;

            if (ast is null)
            {
                return;
            }

            foreach (var line in textView.VisualLines)
            {
                var rc = BackgroundGeometryBuilder.GetRectsFromVisualSegment(textView, line, 0, 1000).FirstOrDefault();
                if (rc == default)
                {
                    continue;
                }

                foreach (var block in AbstractSyntaxTree.EnumerateBlocks(ast.FirstChild))
                {
                    if (block.SourcePosition + block.SourceLength <= line.StartOffset)
                    {
                        continue;
                    }
                    if (block.SourcePosition > line.LastDocumentLine.EndOffset)
                    {
                        break;
                    }

                    // Indented code does not terminate (at least in the AST) until a new
                    // block is encountered. Thus blank lines at the end of the block are
                    // highlighted. It looks much better if they're not highlighted.
                    if (block.Tag == BlockTag.IndentedCode)
                    {
                        var length = block.SourcePosition + block.SourceLength - line.StartOffset;
                        if (line.StartOffset + length > textView.Document.TextLength)
                        {
                            break;
                        }
                        var remainder = textView.Document.GetText(line.StartOffset, length);
                        if (string.IsNullOrWhiteSpace(remainder))
                        {
                            break;
                        }
                    }

                    if (_blockTags.Any(tag => tag == block.Tag))
                    {
                        if (_brushes.TryGetValue(block.Tag, out Brush brush) && brush != null)
                        {
                            drawingContext.DrawRectangle(brush, null,
                                                         new Rect(0, rc.Top, textView.ActualWidth, line.Height));
                        }
                    }
                }
            }
        }
コード例 #2
0
 public static IEnumerable <Issue> Validate(Block document, string text, IWorkspaceItem item)
 {
     foreach (var block in AbstractSyntaxTree.EnumerateBlocks(document))
     {
         foreach (var issue in ValidateBlock(block, text, item))
         {
             yield return(issue);
         }
     }
 }
コード例 #3
0
        public static bool FromAST(string text, int index, Block ast, CompletionList list)
        {
            var    spanningBlock = AbstractSyntaxTree.SpanningBlock(ast, index);
            string pre           = string.Empty;
            var    data          = new List <ICompletionData>();

            if (spanningBlock?.Tag == BlockTag.Meta)
            {
                pre = FindMetaPretext(text, index);
                data.AddRange(FromMetaModel(AppViewModel.Instance.Settings.SelectedTemplate.MetaData));
            }
            else
            {
                char?marker = IdentifyMarker(text, index, out pre);

                if (marker == null || marker == FootnoteMarker)
                {
                    data.AddRange(FromReferences(ast));
                }
                if (marker == null || marker == CitationMarker)
                {
                    data.AddRange(FromBibliography(ast));
                }
                if (marker == null || marker == HtmlMarker)
                {
                    data.AddRange(HtmlData());
                }
                if (marker == null || marker == LatexMarker)
                {
                    data.AddRange(LatexData());
                }
            }

            data.Sort((a, b) => a.Text.CompareTo(b.Text));
            foreach (var item in data)
            {
                list.CompletionData.Add(item);
            }
            if (!string.IsNullOrWhiteSpace(pre))
            {
                list.IsFiltering = true;
                list.SelectItem(pre);
                if (list.IsEmpty())
                {
                    return(false);
                }
            }
            return(true);
        }
コード例 #4
0
        private static bool IsInlined(Block block, Group group)
        {
            var index  = group.Index + block.SourcePosition;
            var inline = AbstractSyntaxTree.SpanningBlockInline(block, index);

            if (inline != null)
            {
                switch (inline.Tag)
                {
                case InlineTag.Code:
                case InlineTag.RawHtml:
                    return(true);
                }
            }
            return(false);
        }
コード例 #5
0
 public static IEnumerable <Issue> Validate(string text, IWorkspaceItem item)
 {
     return(Validate(AbstractSyntaxTree.GenerateAbstractSyntaxTree(text), text, item));
 }