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)); } } } } }
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); } } }
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); }
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); }
public static IEnumerable <Issue> Validate(string text, IWorkspaceItem item) { return(Validate(AbstractSyntaxTree.GenerateAbstractSyntaxTree(text), text, item)); }