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);
        }