private static string BuildImgElement(PictureData pictureData, LazyLoadType lazyLoadType, string cssClass)
        {
            var imgElement = new TagBuilder("img");

            imgElement.Attributes.Add("alt", HttpUtility.HtmlEncode(pictureData.AltText));

            //Add src and/or data-src attribute
            switch (lazyLoadType)
            {
            case LazyLoadType.Regular:
                imgElement.Attributes.Add("data-src", pictureData.ImgSrc);
                break;

            case LazyLoadType.Progressive:
                imgElement.Attributes.Add("src", pictureData.ImgSrcLowQuality);
                imgElement.Attributes.Add("data-src", pictureData.ImgSrc);
                break;

            default:
                imgElement.Attributes.Add("src", pictureData.ImgSrc);
                break;
            }

            //Add class attribute
            if (!string.IsNullOrEmpty(cssClass))
            {
                imgElement.Attributes.Add("class", cssClass);
            }

            return(imgElement.ToString(TagRenderMode.SelfClosing));
        }
        private static string BuildSourceElement(PictureData pictureData, LazyLoadType lazyLoadType, string format = "")
        {
            var sourceElement = new TagBuilder("source");

            var srcset = pictureData.SrcSet;

            if (format == "webp")
            {
                srcset = pictureData.SrcSetWebp;
                sourceElement.Attributes.Add("type", "image/" + format);
            }

            switch (lazyLoadType)
            {
            case LazyLoadType.Regular:
                sourceElement.Attributes.Add("data-srcset", srcset);
                break;

            case LazyLoadType.Progressive:
                sourceElement.Attributes.Add("srcset", format == "webp" ? pictureData.SrcSetLowQualityWebp : pictureData.SrcSetLowQuality);
                sourceElement.Attributes.Add("data-srcset", srcset);
                break;

            default:
                sourceElement.Attributes.Add("srcset", srcset);
                break;
            }

            //Add sizes attribute
            sourceElement.Attributes.Add("sizes", pictureData.SizesAttribute);

            return(sourceElement.ToString(TagRenderMode.SelfClosing));
        }
        private static string BuildPictureElement(PictureData pictureData, string cssClass, LazyLoadType lazyLoadType)
        {
            //Create picture element
            var pictureElement = new TagBuilder("picture");

            if (pictureData.SrcSet != null)
            {
                if (pictureData.SrcSetWebp != null)
                {
                    //Add source element with webp versions. Needs to be rendered before jpg version, browser selects the first version it supports.
                    pictureElement.InnerHtml += BuildSourceElement(pictureData, lazyLoadType, "webp");
                }

                //Add source element to picture element
                pictureElement.InnerHtml += BuildSourceElement(pictureData, lazyLoadType);
            }

            //Add img element to picture element
            pictureElement.InnerHtml += BuildImgElement(pictureData, lazyLoadType, cssClass);

            return(pictureElement.ToString());
        }
        public static IHtmlString Picture(this HtmlHelper helper, UrlBuilder imageUrl, ImageType imageType, string cssClass = "", LazyLoadType lazyLoadType = LazyLoadType.None, string altText = "")
        {
            if (imageUrl == null)
            {
                return(new MvcHtmlString(string.Empty));
            }

            var pictureData    = PictureUtils.GetPictureData(imageUrl, imageType, lazyLoadType == LazyLoadType.Progressive, altText);
            var pictureElement = BuildPictureElement(pictureData, cssClass, lazyLoadType);

            return(new MvcHtmlString(HttpUtility.HtmlDecode(pictureElement)));
        }
        public static IHtmlString Picture(this HtmlHelper helper, string imageUrl, ImageType imageType, string cssClass = "", LazyLoadType lazyLoadType = LazyLoadType.None, string altText = "")
        {
            if (imageUrl == null)
            {
                return(new MvcHtmlString(string.Empty));
            }

            var urlBuilder = new UrlBuilder(imageUrl);

            return(Picture(helper, urlBuilder, imageType, cssClass, lazyLoadType, altText));
        }