Exemplo n.º 1
0
        /// <summary>
        /// Read recommendation.
        /// </summary>
        private bool Recommendation(TokenStream stream, RuleDocument doc)
        {
            if (!IsHeading(stream.Current, RULE_ENTRIES_HEADING_LEVEL, DocumentStrings.Recommendation))
            {
                return(false);
            }

            doc.Recommendation = TextBlock(stream);
            stream.SkipUntilHeader();
            return(true);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Read synopsis.
        /// </summary>
        private bool Synopsis(TokenStream stream, RuleDocument doc)
        {
            if (!IsHeading(stream.Current, RULE_ENTRIES_HEADING_LEVEL, DocumentStrings.Synopsis))
            {
                return(false);
            }

            doc.Synopsis = TextBlock(stream);
            stream.SkipUntilHeader();
            return(true);
        }
Exemplo n.º 3
0
        private bool RelatedLinks(TokenStream stream, RuleDocument doc)
        {
            if (!IsHeading(stream.Current, RULE_ENTRIES_HEADING_LEVEL, DocumentStrings.Links))
            {
                return(false);
            }

            List <Link> links = new List <Link>();

            stream.Next();

            while (stream.IsTokenType(MarkdownTokenType.Link, MarkdownTokenType.LinkReference, MarkdownTokenType.LineBreak))
            {
                if (stream.IsTokenType(MarkdownTokenType.LineBreak))
                {
                    stream.Next();

                    continue;
                }

                var link = new Link
                {
                    Name = stream.Current.Meta,
                    Uri  = stream.Current.Text
                };

                // Update link to point to resolved target
                if (stream.IsTokenType(MarkdownTokenType.LinkReference))
                {
                    var target = stream.ResolveLinkTarget(link.Uri);
                    link.Uri = target.Text;
                }

                links.Add(link);

                stream.Next();
            }

            stream.SkipUntilHeader();

            doc.Links = links.ToArray();

            return(true);
        }
Exemplo n.º 4
0
        public RuleDocument Process(TokenStream stream)
        {
            stream.MoveTo(0);

            // Look for yaml header
            var metadata = YamlHeader(stream);

            RuleDocument doc = null;

            // Process sections
            while (!stream.EOF)
            {
                if (IsHeading(stream.Current, RULE_NAME_HEADING_LEVEL))
                {
                    doc = new RuleDocument(stream.Current.Text)
                    {
                        Annotations = TagSet.FromDictionary(metadata)
                    };
                }
                else if (doc != null && IsHeading(stream.Current, RULE_ENTRIES_HEADING_LEVEL))
                {
                    var matching = Synopsis(stream, doc) ||
                                   Description(stream, doc) ||
                                   Recommendation(stream, doc) ||
                                   Notes(stream, doc) ||
                                   RelatedLinks(stream, doc);

                    if (matching)
                    {
                        continue;
                    }
                }

                // Skip the current token
                stream.Next();
            }

            return(doc);
        }