Ejemplo n.º 1
0
        /// <summary>
        /// Create a parser for the set of tags and shortcodes that have been defined.
        /// </summary>
        /// <param name="throwOnUnknownTag">If true, undefined tags return null rather than throwing an exception.</param>
        /// <returns></returns>
        /// <remarks>The option to ignore unknown tags can be used to ignore output tags that are not defined until the render process.</remarks>
        private Parser <Statement> CreateKnownTagsParser(bool throwOnUnknownTag)
        {
            var parser = OneOf(
                LavaTagParsers.LavaTagStart()
                .SkipAnd(Identifier.ElseError(ErrorMessages.IdentifierAfterTagStart)
                         .Switch((context, tagName) =>
            {
                if (RegisteredTags.TryGetValue(tagName, out var tag))
                {
                    return(tag);
                }
                else if (throwOnUnknownTag)
                {
                    throw new global::Fluid.ParseException($"Unknown tag '{tagName}' at {context.Scanner.Cursor.Position}");
                }

                return(null);
            })
                         ),
                LavaTagParsers.LavaShortcodeStart()
                .SkipAnd(Identifier.ElseError(ErrorMessages.IdentifierAfterTagStart)
                         .Switch((context, tagName) =>
            {
                var shortcodeTagName = tagName + "_";

                if (RegisteredTags.TryGetValue(shortcodeTagName, out var shortcode))
                {
                    return(shortcode);
                }

                throw new global::Fluid.ParseException($"Unknown shortcode '{tagName}' at {context.Scanner.Cursor.Position}");
            })
                         )
                );

            return(parser);
        }
 IEnumerable <RegisterDirective> GetDirectivesForPrefix(string prefix)
 {
     return(RegisteredTags.Where(t => string.Equals(t.TagPrefix, prefix, StringComparison.OrdinalIgnoreCase)));
 }