Esempio n. 1
0
        public async Task PopulateHtmlTagAsync(ITagBuilderOptions options, ReadOnlyTagHelperAttributeList attributeList, Asset asset, IHtmlContentBuilder output)
        {
            TagBuilder tagBuilder = null;

            var outputMode = options.Output;

            if (!this.Options.BundleStylesheets && !this.Options.MinifyStylesheets)
            {
                outputMode = OptimizationTagOutput.Tag;
            }
            else if (OptimizationTagOutput.Tag == outputMode && (this.Options.BundleStylesheets || this.Options.MinifyStylesheets))
            {
                outputMode = OptimizationTagOutput.StaticFile;
            }

            switch (outputMode)
            {
            case OptimizationTagOutput.Default:     //same as OptimizationTagOutput.Inline
                string content = await asset.ReadContentAsStringAsync();

                output.AppendHtmlLine($"<style>{content}</style>");
                break;

            case OptimizationTagOutput.Tag:
                tagBuilder = new TagBuilder("link");
                tagBuilder.TagRenderMode = TagRenderMode.SelfClosing;
                tagBuilder.Attributes.Add("rel", "stylesheet");
                tagBuilder.Attributes.Add("type", "text/css");
                tagBuilder.Attributes.Add("href", asset.GetWebLocation(this.Options));

                output.AppendHtml(tagBuilder);
                break;

            case OptimizationTagOutput.StaticFile:
            case OptimizationTagOutput.Loader:

                string     webPath          = null;
                PathString relativeFilePath = new PathString(this.Options.StaticAssetsPath).Add($"/{asset.Name}");
                var        assetFileInfo    = this.HostingEnvironment.WebRootFileProvider.GetFileInfo(relativeFilePath);

                if (!assetFileInfo.Exists)
                {
                    content = await asset.ReadContentAsStringAsync();

                    await File.WriteAllTextAsync(assetFileInfo.PhysicalPath, content, Encoding.UTF8);
                }

                if (string.IsNullOrWhiteSpace(this.Options.AssetRootUrl))
                {
                    webPath = this.HttpContextAccessor.HttpContext.Request.PathBase.Add(relativeFilePath);
                }
                else
                {
                    if (!Uri.TryCreate(this.Options.AssetRootUrl, UriKind.Absolute, out Uri cdnRootUri))
                    {
                        throw new UriFormatException($"'{this.Options.AssetRootUrl}' is an invalid Uri. An absolute Uri is expected.");
                    }
                    Uri.TryCreate(cdnRootUri, $"{asset.Name}", out Uri webPathUri);
                    webPath = webPathUri.ToString();
                }

                tagBuilder = new TagBuilder("link");
                tagBuilder.TagRenderMode = TagRenderMode.SelfClosing;
                tagBuilder.Attributes.Add("rel", "stylesheet");
                tagBuilder.Attributes.Add("type", "text/css");
                tagBuilder.Attributes.Add("href", webPath);

                output.AppendHtml(tagBuilder);
                break;
            }
        }
Esempio n. 2
0
        public async Task PopulateHtmlTagAsync(ITagBuilderOptions options, ReadOnlyTagHelperAttributeList attributeList, Asset asset, IHtmlContentBuilder output)
        {
            TagBuilder tagBuilder = new TagBuilder("script");

            tagBuilder.TagRenderMode = TagRenderMode.Normal;
            tagBuilder.Attributes.Add("type", "text/javascript");

            if (attributeList.ContainsName("defer"))
            {
                tagBuilder.Attributes.Add("defer", null);
            }
            else if (attributeList.ContainsName("async"))
            {
                tagBuilder.Attributes.Add("async", null);
            }

            var outputMode = options.Output;

            if (!this.Options.BundleJavascripts && !this.Options.MinifyJavascripts && OptimizationTagOutput.Loader != outputMode)
            {
                outputMode = OptimizationTagOutput.Tag;
            }
            else if (OptimizationTagOutput.Tag == outputMode && (this.Options.BundleJavascripts || this.Options.MinifyJavascripts))
            {
                outputMode = OptimizationTagOutput.StaticFile;
            }

            switch (outputMode)
            {
            case OptimizationTagOutput.Default:     //same as OptimizationTagOutput.Inline
                string content = await asset.ReadContentAsStringAsync();

                tagBuilder.InnerHtml.SetHtmlContent(content);
                break;

            case OptimizationTagOutput.Tag:
                tagBuilder.Attributes.Add("src", asset.GetWebLocation(this.Options));
                if (null != asset?.Content)
                {
                    await asset.Content.DisposeAsync();
                }
                break;

            case OptimizationTagOutput.StaticFile:
            case OptimizationTagOutput.Loader:

                string     webPath          = null;
                PathString relativeFilePath = new PathString(this.Options.StaticAssetsPath).Add($"/{asset.Name}");
                var        assetFileInfo    = this.HostingEnvironment.WebRootFileProvider.GetFileInfo(relativeFilePath);
                if (!assetFileInfo.Exists)
                {
                    content = await asset.ReadContentAsStringAsync();

                    await File.WriteAllTextAsync(assetFileInfo.PhysicalPath, content, Encoding.UTF8);
                }


                if (string.IsNullOrWhiteSpace(this.Options.AssetRootUrl))
                {
                    webPath = this.HttpContextAccessor.HttpContext.Request.PathBase.Add(relativeFilePath);
                }
                else
                {
                    if (!Uri.TryCreate(this.Options.AssetRootUrl, UriKind.Absolute, out Uri cdnRootUri))
                    {
                        throw new UriFormatException($"'{this.Options.AssetRootUrl}' is an invalid Uri. An absolute Uri is expected.");
                    }
                    Uri.TryCreate(cdnRootUri, $"{asset.Name}", out Uri webPathUri);
                    webPath = webPathUri.ToString();
                }

                if (OptimizationTagOutput.StaticFile == outputMode)
                {
                    tagBuilder.Attributes.Add("src", webPath);
                }
                else
                {
                    tagBuilder.InnerHtml.SetHtmlContent($"adriva.optimization.loader.push('{webPath}', 1)");
                }

                if (null != asset?.Content)
                {
                    await asset.Content.DisposeAsync();
                }
                break;
            }

            output.AppendHtml(tagBuilder);
        }