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