/// <inheritdoc /> public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { // Pass through attribute that is also a well-known HTML attribute. if (Src != null) { output.CopyHtmlAttribute(SrcAttributeName, context); } var modeResult = AttributeMatcher.DetermineMode(context, ModeDetails); var logger = Logger ?? LoggerFactory.CreateLogger <ScriptTagHelper>(); modeResult.LogDetails(logger, this, context.UniqueId, ViewContext.View.Path); if (!modeResult.FullMatches.Any()) { // No attributes matched so we have nothing to do return; } // Get the highest matched mode var mode = modeResult.FullMatches.Select(match => match.Mode).Max(); // NOTE: Values in TagHelperOutput.Attributes may already be HTML-encoded. var attributes = new Dictionary <string, object>(output.Attributes); var builder = new DefaultTagHelperContent(); var originalContent = await context.GetChildContentAsync(); if (mode == Mode.Fallback && string.IsNullOrEmpty(SrcInclude) || mode == Mode.FileVersion) { // No globbing to do, just build a <script /> tag to match the original one in the source file // Or just add file version to the script tag. BuildScriptTag(originalContent, attributes, builder); } else { BuildGlobbedScriptTags(originalContent, attributes, builder); } if (mode == Mode.Fallback) { BuildFallbackBlock(attributes, builder); } // We've taken over tag rendering, so prevent rendering the outer tag output.TagName = null; output.Content.SetContent(builder); }
/// <inheritdoc /> public override void Process(TagHelperContext context, TagHelperOutput output) { // Pass through attribute that is also a well-known HTML attribute. if (Href != null) { output.CopyHtmlAttribute(HrefAttributeName, context); } var modeResult = AttributeMatcher.DetermineMode(context, ModeDetails); modeResult.LogDetails(Logger, this, context.UniqueId, ViewContext.View.Path); if (!modeResult.FullMatches.Any()) { // No attributes matched so we have nothing to do return; } // Get the highest matched mode var mode = modeResult.FullMatches.Select(match => match.Mode).Max(); // NOTE: Values in TagHelperOutput.Attributes may already be HTML-encoded. var attributes = new TagHelperAttributeList(output.Attributes); var builder = new DefaultTagHelperContent(); if (mode == Mode.Fallback && string.IsNullOrEmpty(HrefInclude) || mode == Mode.FileVersion) { // No globbing to do, just build a <link /> tag to match the original one in the source file. // Or just add file version to the link tag. BuildLinkTag(attributes, builder); } else { BuildGlobbedLinkTags(attributes, builder); } if (mode == Mode.Fallback) { BuildFallbackBlock(builder); } // We've taken over tag rendering, so prevent rendering the outer tag output.TagName = null; output.Content.SetContent(builder); }
/// <inheritdoc /> public override void Process(TagHelperContext context, TagHelperOutput output) { string resolvedUrl; // Pass through attribute that is also a well-known HTML attribute. if (Src != null) { output.CopyHtmlAttribute(SrcAttributeName, context); if (TryResolveUrl(Src, encodeWebRoot: false, resolvedUrl: out resolvedUrl)) { Src = resolvedUrl; } ProcessUrlAttribute(SrcAttributeName, output); } var modeResult = AttributeMatcher.DetermineMode(context, ModeDetails); modeResult.LogDetails(Logger, this, context.UniqueId, ViewContext.View.Path); if (!modeResult.FullMatches.Any()) { // No attributes matched so we have nothing to do return; } // NOTE: Values in TagHelperOutput.Attributes may already be HTML-encoded. var attributes = new TagHelperAttributeList(output.Attributes); if (AppendVersion == true) { EnsureFileVersionProvider(); var attributeStringValue = output.Attributes[SrcAttributeName]?.Value as string; if (attributeStringValue != null) { output.Attributes[SrcAttributeName].Value = _fileVersionProvider.AddFileVersionToPath(attributeStringValue); } } var builder = new DefaultTagHelperContent(); // Get the highest matched mode var mode = modeResult.FullMatches.Select(match => match.Mode).Max(); if (mode == Mode.GlobbedSrc || mode == Mode.Fallback && !string.IsNullOrEmpty(SrcInclude)) { BuildGlobbedScriptTags(attributes, builder); if (string.IsNullOrEmpty(Src)) { // Only SrcInclude is specified. Don't render the original tag. output.TagName = null; output.Content.SetContent(string.Empty); } } if (mode == Mode.Fallback) { if (TryResolveUrl(FallbackSrc, encodeWebRoot: false, resolvedUrl: out resolvedUrl)) { FallbackSrc = resolvedUrl; } BuildFallbackBlock(attributes, builder); } output.PostElement.SetContent(builder); }
/// <inheritdoc /> public override void Process(TagHelperContext context, TagHelperOutput output) { string resolvedUrl; // Pass through attribute that is also a well-known HTML attribute. if (Href != null) { output.CopyHtmlAttribute(HrefAttributeName, context); } // If there's no "href" attribute in output.Attributes this will noop. ProcessUrlAttribute(HrefAttributeName, output); // Retrieve the TagHelperOutput variation of the "href" attribute in case other TagHelpers in the // pipeline have touched the value. If the value is already encoded this LinkTagHelper may // not function properly. Href = output.Attributes[HrefAttributeName]?.Value as string; var modeResult = AttributeMatcher.DetermineMode(context, ModeDetails); modeResult.LogDetails(Logger, this, context.UniqueId, ViewContext.View.Path); if (!modeResult.FullMatches.Any()) { // No attributes matched so we have nothing to do return; } // NOTE: Values in TagHelperOutput.Attributes may already be HTML-encoded. var attributes = new TagHelperAttributeList(output.Attributes); if (AppendVersion == true) { EnsureFileVersionProvider(); if (Href != null) { output.Attributes[HrefAttributeName].Value = _fileVersionProvider.AddFileVersionToPath(Href); } } var builder = new DefaultTagHelperContent(); // Get the highest matched mode var mode = modeResult.FullMatches.Select(match => match.Mode).Max(); if (mode == Mode.GlobbedHref || mode == Mode.Fallback && !string.IsNullOrEmpty(HrefInclude)) { BuildGlobbedLinkTags(attributes, builder); if (string.IsNullOrEmpty(Href)) { // Only HrefInclude is specified. Don't render the original tag. output.TagName = null; output.Content.SetContent(HtmlString.Empty); } } if (mode == Mode.Fallback) { if (TryResolveUrl(FallbackHref, encodeWebRoot: false, resolvedUrl: out resolvedUrl)) { FallbackHref = resolvedUrl; } BuildFallbackBlock(builder); } output.PostElement.SetContent(builder); }