示例#1
0
        private static string BuildUrl(string hash, int? size, GravatarRating rating, GravatarDefaultImage defaultImage) {
            var url = new StringBuilder("http://www.gravatar.com/avatar/", 90);
            url.Append(hash);

            bool isFirst = true;
            Action<string, string> addParam = (p, v) => {
                url.AppendFormat("{0}{1}={2}", (isFirst ? '?' : '&'), p, v);
                isFirst = false;
            };

            if (size != null) {
                if (size < 1 || size > 512) {
                    throw new ArgumentOutOfRangeException("size", size, "Must be null or between 1 and 512, inclusive");
                }
                addParam("s", size.Value.ToString());
            }

            if (rating != GravatarRating.Default) {
                addParam("r", rating.ToString().ToLower());
            }

            if (defaultImage != GravatarDefaultImage.Default) {
                string code = GenerateDefaultImageCode(defaultImage);
                addParam("d", code);
            }
            return url.ToString();
        }
示例#2
0
        private static string BuildUrl(string hash, int?size, GravatarRating rating, GravatarDefaultImage defaultImage)
        {
            var url = new StringBuilder("http://www.gravatar.com/avatar/", 90);

            url.Append(hash);

            bool isFirst = true;
            Action <string, string> addParam = (p, v) => {
                url.AppendFormat("{0}{1}={2}", (isFirst ? '?' : '&'), p, v);
                isFirst = false;
            };

            if (size != null)
            {
                if (size < 1 || size > 512)
                {
                    throw new ArgumentOutOfRangeException(nameof(size), size, "Must be null or between 1 and 512, inclusive");
                }
                addParam("s", size.Value.ToString());
            }

            if (rating != GravatarRating.Default)
            {
                addParam("r", rating.ToString().ToLower());
            }

            if (defaultImage != GravatarDefaultImage.Default)
            {
                string code = GenerateDefaultImageCode(defaultImage);
                addParam("d", code);
            }
            return(url.ToString());
        }
示例#3
0
    /// <summary>
    /// Creates HTML for an <c>img</c> element that presents a Gravatar icon.
    /// </summary>
    /// <param name="html">The <see cref="HtmlHelper"/> upon which this extension method is provided.</param>
    /// <param name="email">The email address used to identify the icon.</param>
    /// <param name="size">An optional parameter that specifies the size of the square image in pixels.</param>
    /// <param name="rating">An optional parameter that specifies the safety level of allowed images.</param>
    /// <param name="defaultImage">An optional parameter that controls what image is displayed for email addresses that don't have associated Gravatar icons.</param>
    /// <param name="htmlAttributes">An optional parameter holding additional attributes to be included on the <c>img</c> element.</param>
    /// <returns>An HTML string of the <c>img</c> element that presents a Gravatar icon.</returns>
    public static string Gravatar(this HtmlHelper html,
                                  string email,
                                  int? size = null,
                                  GravatarRating rating = GravatarRating.Default,
                                  GravatarDefaultImage defaultImage = GravatarDefaultImage.MysteryMan,
                                  object htmlAttributes = null)
    {
      var url = new StringBuilder("http://www.gravatar.com/avatar/", 90);
      url.Append(email.ToMd5Hash());

      var isFirst = true;
      Action<string, string> addParam = (p, v) =>
      {
        url.Append(isFirst ? '?' : '&');
        isFirst = false;
        url.Append(p);
        url.Append('=');
        url.Append(v);
      };

      if (size != null)
      {
        if (size < 1 || size > 512)
          throw new ArgumentOutOfRangeException("size", size, "Must be null or between 1 and 512, inclusive.");
        addParam("s", size.Value.ToString(CultureInfo.InvariantCulture));
      }

      if (rating != GravatarRating.Default)
        addParam("r", rating.ToString().ToLower());

      switch (defaultImage)
      {
        case GravatarDefaultImage.Http404:
          addParam("d", "404");
          break;
        case GravatarDefaultImage.Identicon:
          addParam("d", "identicon");
          break;
        case GravatarDefaultImage.MonsterId:
          addParam("d", "monsterid");
          break;
        case GravatarDefaultImage.MysteryMan:
          addParam("d", "mm");
          break;
        case GravatarDefaultImage.Wavatar:
          addParam("d", "wavatar");
          break;
      }

      var tag = new TagBuilder("img");
      tag.MergeAttributes(new RouteValueDictionary(htmlAttributes));
      tag.Attributes.Add("src", url.ToString());

      if (size != null)
      {
        tag.Attributes.Add("width", size.ToString());
        tag.Attributes.Add("height", size.ToString());
      }
      return tag.ToString(TagRenderMode.SelfClosing);
    }
    /// <summary>
    ///   <para>Predefined type of image to be returned when user's email address has no matching Gravatar image.</para>
    /// </summary>
    /// <param name="widget">Widget to call method on.</param>
    /// <param name="image">Type of default image.</param>
    /// <returns>Reference to provided <paramref name="widget"/>.</returns>
    /// <exception cref="ArgumentNullException">If <paramref name="widget"/> is a <c>null</c> reference.</exception>
    /// <seealso cref="Default(IGravatarImageUrlWidget, string)"/>
    public static IGravatarImageUrlWidget Default(this IGravatarImageUrlWidget widget, GravatarDefaultImage image)
    {
      Assertion.NotNull(widget);

      switch (image)
      {
        case GravatarDefaultImage.Blank :
          return widget.Default("blank");

        case GravatarDefaultImage.IdentIcon :
          return widget.Default("identicon");

        case GravatarDefaultImage.MonsterId :
          return widget.Default("monsterid");

        case GravatarDefaultImage.MysteryMan :
          return widget.Default("mm");

        case GravatarDefaultImage.Retro :
          return widget.Default("retro");

        case GravatarDefaultImage.Wavatar :
          return widget.Default("wavatar");

        default:
          return widget.Default("404");
      }
    }
示例#5
0
        /// <summary>
        ///    Gets image url that depends on the given e-mail address.
        /// </summary>
        /// <param name="email"></param>
        /// <param name="size"></param>
        /// <param name="rating"></param>
        /// <param name="defaultImage"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentOutOfRangeException"></exception>
        public static string GetImageAddress(string email, int?size            = null,
                                             GravatarRating rating             = GravatarRating.Default,
                                             GravatarDefaultImage defaultImage = GravatarDefaultImage.MysteryMan)
        {
            var url = new StringBuilder("//www.gravatar.com/avatar/", 90);

            url.Append(GetEmailHash(email));

            var isFirst = true;
            Action <string, string> addParam = (p, v) =>
            {
                url.Append(isFirst ? '?' : '&');
                isFirst = false;
                url.Append(p);
                url.Append('=');
                url.Append(v);
            };

            if (size != null)
            {
                if (size < 1 || size > 512)
                {
                    throw new ArgumentOutOfRangeException("size", size,
                                                          "Must be null or between 1 and 512, inclusive.");
                }
                addParam("s", size.Value.ToString());
            }

            if (rating != GravatarRating.Default)
            {
                addParam("r", rating.ToString().ToLower());
            }

            if (defaultImage != GravatarDefaultImage.Default)
            {
                if (defaultImage == GravatarDefaultImage.Http404)
                {
                    addParam("d", "404");
                }
                else if (defaultImage == GravatarDefaultImage.Identicon)
                {
                    addParam("d", "identicon");
                }
                else if (defaultImage == GravatarDefaultImage.MonsterId)
                {
                    addParam("d", "monsterid");
                }
                else if (defaultImage == GravatarDefaultImage.MysteryMan)
                {
                    addParam("d", "mm");
                }
                else if (defaultImage == GravatarDefaultImage.Wavatar)
                {
                    addParam("d", "wavatar");
                }
            }

            return(url.ToString());
        }
示例#6
0
 public Gravatar DefaultingTo(string alternativeUrl)
 {
     if (alternativeUrl.Contains("?") || alternativeUrl.ToLowerInvariant().Contains("%3f"))
     {
         throw new ArgumentException("URLs for default avatars cannot contain query components.", "alternativeUrl");
     }
     _defaultAvatar = alternativeUrl;
     _defaultImage  = GravatarDefaultImage.Url;
     return(this);
 }
示例#7
0
        public Gravatar DefaultingTo(GravatarDefaultImage defaultImage)
        {
            if (defaultImage == GravatarDefaultImage.Url)
            {
                throw new ArgumentException("Use the string version of DefaultingTo to set the URL.", "defaultImage");
            }

            _defaultImage = defaultImage;
            return(this);
        }
        private static string BuildGravatarUrl(string email, GravatarRating rating, GravatarDefaultImage defaultImage, int? size = null)
        {
            var urlBuilder = new StringBuilder(GRAVATAR_URL, 90);
            urlBuilder.Append(GetEmailHash(email));

            var isFirst = true;
            Action<string, string> addParam = (name, value) =>
            {
                urlBuilder.Append(isFirst ? '?' : '&');
                isFirst = false;
                urlBuilder.Append(name);
                urlBuilder.Append("=");
                urlBuilder.Append(value);
            };

            if (size != null)
            {
                if (size < 1 || size > 512)
                    throw new ArgumentOutOfRangeException("size", size, "Must be null or value between 1 and 512, inclusive.");

                addParam("s", size.Value.ToString());
            }

            if (rating != GravatarRating.Default)
                addParam("r", rating.ToString().ToLower());

            if (defaultImage != GravatarDefaultImage.Default)
            {
                string imageToShow = "";

                switch (defaultImage)
                {
                    case GravatarDefaultImage.Http404:
                        imageToShow = "404";
                        break;
                    case GravatarDefaultImage.MysteryMan:
                        imageToShow = "mm";
                        break;
                    case GravatarDefaultImage.Identicon:
                        imageToShow = "identicon";
                        break;
                    case GravatarDefaultImage.MonsterId:
                        imageToShow = "monsterid";
                        break;
                    case GravatarDefaultImage.Wavatar:
                        imageToShow = "wavatar";
                        break;
                }

                addParam("d", imageToShow);
            }

            return urlBuilder.ToString();
        }
        public static string Gravatar(this HtmlHelper html, 
                                      string email, 
                                      int? size = null, 
                                      GravatarRating rating = GravatarRating.Default, 
                                      GravatarDefaultImage defaultImage = GravatarDefaultImage.MysteryMan, 
                                      object htmlAttributes = null)
        {
            string gravatarUrl = BuildGravatarUrl(email, rating, defaultImage, size);

            return BuildGravatarImageTag(gravatarUrl, size, htmlAttributes);
        }
示例#10
0
        /// <summary>
        /// Creates HTML for an <c>img</c> element that presents a Gravatar icon.
        /// </summary>
        /// <param name="html">The <see cref="HtmlHelper"/> upon which this extension method is provided.</param>
        /// <param name="email">The email address used to identify the icon.</param>
        /// <param name="size">An optional parameter that specifies the size of the square image in pixels.</param>
        /// <param name="rating">An optional parameter that specifies the safety level of allowed images.</param>
        /// <param name="defaultImage">An optional parameter that controls what image is displayed for email addresses that don't have associated Gravatar icons.</param>
        /// <param name="htmlAttributes">An optional parameter holding additional attributes to be included on the <c>img</c> element.</param>
        /// <returns>An HTML string of the <c>img</c> element that presents a Gravatar icon.</returns>
        public static string Gravatar(this HtmlHelper html,
                                      string email,
                                      int? size = null,
                                      GravatarDefaultImage defaultImage = GravatarDefaultImage.Default,
                                      object htmlAttributes = null)
        {
            var url = new StringBuilder("https://www.gravatar.com/avatar/", 90);
            url.Append(GetEmailHash(email));

            var isFirst = true;
            Action<string, string> addParam = (p, v) =>
            {
                url.Append(isFirst ? '?' : '&');
                isFirst = false;
                url.Append(p);
                url.Append('=');
                url.Append(v);
            };

            if (size != null)
            {
                if (size < 1 || size > 512)
                    throw new ArgumentOutOfRangeException("size", size, "Must be null or between 1 and 512, inclusive.");
                addParam("s", size.Value.ToString());
            }

            if (defaultImage != GravatarDefaultImage.Default)
            {
                if (defaultImage == GravatarDefaultImage.Http404)
                    addParam("d", "404");
                else if (defaultImage == GravatarDefaultImage.Identicon)
                    addParam("d", "identicon");
                if (defaultImage == GravatarDefaultImage.MonsterId)
                    addParam("d", "monsterid");
                if (defaultImage == GravatarDefaultImage.MysteryMan)
                    addParam("d", "mm");
                if (defaultImage == GravatarDefaultImage.Wavatar)
                    addParam("d", "wavatar");
            }

            var tag = new TagBuilder("img");
            tag.MergeAttributes(new RouteValueDictionary(htmlAttributes));
            tag.Attributes.Add("src", url.ToString());

            if (size != null)
            {
                tag.Attributes.Add("width", size.ToString());
                tag.Attributes.Add("height", (size-5).ToString());
            }

            return tag.ToString();
        }
示例#11
0
 /// <summary>
 ///    Gets image as base64 formatted that depends on the given e-mail address.
 /// </summary>
 /// <param name="email"></param>
 /// <param name="size"></param>
 /// <param name="rating"></param>
 /// <param name="defaultImage"></param>
 /// <returns></returns>
 public static string GetImageAsBase64(string email, int?size            = null,
                                       GravatarRating rating             = GravatarRating.Default,
                                       GravatarDefaultImage defaultImage = GravatarDefaultImage.MysteryMan)
 {
     try
     {
         var image = GetImage(email, size, rating, defaultImage);
         return
             ($"data:image/jpeg;base64,{Convert.ToBase64String(ConvertToByte(image, ImageFormat.Jpeg))}");
     }
     catch (Exception)
     {
         return(null);
     }
 }
示例#12
0
 private static string GenerateDefaultImageCode(GravatarDefaultImage defaultImage) {
     switch (defaultImage) {
         case GravatarDefaultImage.Http404:
             return "404";
         case GravatarDefaultImage.Identicon:
             return "identicon";
         case GravatarDefaultImage.MonsterId:
             return "monsterid";
         case GravatarDefaultImage.MysteryMan:
             return "mm";
         case GravatarDefaultImage.Wavatar:
             return "wavatar";
         default:
             return string.Empty;
     }
 }
示例#13
0
        public static MvcHtmlString Gravatar(this HtmlHelper htmlHelper, string email, short? size = null,
                                             GravatarRating rating = GravatarRating.Default,
                                             GravatarDefaultImage defaultImage = GravatarDefaultImage.MysteryMan,
                                             object htmlAttributes = null) {
            string hash = GenerateEmailHash(email);
            string url = BuildUrl(hash, size, rating, defaultImage);

            var imgTagBuilder = new TagBuilder("img");
            imgTagBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
            imgTagBuilder.Attributes.Add("src", url);
            imgTagBuilder.Attributes.Add("alt", "Avatar Image");

            if (size != null) {
                imgTagBuilder.Attributes.Add("width", size.ToString());
                imgTagBuilder.Attributes.Add("height", size.ToString());
            }
            return MvcHtmlString.Create(imgTagBuilder.ToString(TagRenderMode.SelfClosing));
        }
示例#14
0
        /// <summary>
        ///     Creates HTML for an <c>img</c> element that presents a Gravatar icon.
        /// </summary>
        /// <param name="html">The <see cref="HtmlHelper" /> upon which this extension method is provided.</param>
        /// <param name="email">The email address used to identify the icon.</param>
        /// <param name="size">An optional parameter that specifies the size of the square image in pixels.</param>
        /// <param name="rating">An optional parameter that specifies the safety level of allowed images.</param>
        /// <param name="defaultImage">
        ///     An optional parameter that controls what image is displayed for email addresses that don't
        ///     have associated Gravatar icons.
        /// </param>
        /// <param name="htmlAttributes">
        ///     An optional parameter holding additional attributes to be included on the <c>img</c>
        ///     element.
        /// </param>
        /// <returns>An HTML string of the <c>img</c> element that presents a Gravatar icon.</returns>
        public static MvcHtmlString Gravatar(this HtmlHelper html,
                                             string email,
                                             int?size = null,
                                             GravatarRating rating             = GravatarRating.Default,
                                             GravatarDefaultImage defaultImage = GravatarDefaultImage.MysteryMan,
                                             object htmlAttributes             = null)
        {
            var url = Web.Utilities.GravatarPack.Gravatar.GetImageAddress(email, size, rating, defaultImage);

            var tag = new TagBuilder("img");

            tag.MergeAttributes(new RouteValueDictionary(htmlAttributes));
            tag.Attributes.Add("src", url);

            if (size != null)
            {
                tag.Attributes.Add("width", size.ToString());
                tag.Attributes.Add("height", size.ToString());
            }

            return(new MvcHtmlString(tag.ToString()));
        }
示例#15
0
        private static string GenerateDefaultImageCode(GravatarDefaultImage defaultImage)
        {
            switch (defaultImage)
            {
            case GravatarDefaultImage.Http404:
                return("404");

            case GravatarDefaultImage.Identicon:
                return("identicon");

            case GravatarDefaultImage.MonsterId:
                return("monsterid");

            case GravatarDefaultImage.MysteryMan:
                return("mm");

            case GravatarDefaultImage.Wavatar:
                return("wavatar");

            default:
                return(string.Empty);
            }
        }
示例#16
0
        /// <summary>
        ///    Gets image that depends on the given e-mail address.
        /// </summary>
        /// <param name="email"></param>
        /// <param name="size"></param>
        /// <param name="rating"></param>
        /// <param name="defaultImage"></param>
        /// <returns></returns>
        public static Image GetImage(string email, int?size            = null, GravatarRating rating = GravatarRating.Default,
                                     GravatarDefaultImage defaultImage = GravatarDefaultImage.MysteryMan)
        {
            try
            {
                // When protocol doesn't specificated, WebRequest.Create throws an exception.
                var imageUrl = $"http:{GetImageAddress(email, size, rating, defaultImage)}";
                var request  = WebRequest.Create(imageUrl);

                using (var response = request.GetResponse())
                {
                    using (var stream = response.GetResponseStream())
                    {
                        return(stream != null
                            ? Image.FromStream(stream)
                            : null);
                    }
                }
            }
            catch (Exception)
            {
                return(null);
            }
        }
示例#17
0
        public static IHtmlString Gravatar(
            HtmlHelper Html,
            dynamic Shape,
            string Email,
            int?Size = null,
            GravatarRating Rating             = GravatarRating.Default,
            GravatarDefaultImage DefaultImage = GravatarDefaultImage.MysteryMan)
        {
            var url = new StringBuilder("//www.gravatar.com/avatar/", 90);

            url.Append(GetEmailHash(Email));

            var isFirst = true;
            Action <string, string> addParam = (p, v) => {
                url.Append(isFirst ? '?' : '&');
                isFirst = false;
                url.Append(p);
                url.Append('=');
                url.Append(v);
            };

            if (Size != null)
            {
                if (Size < 1 || Size > 512)
                {
                    throw new ArgumentOutOfRangeException("size", Size, "Must be null or between 1 and 512, inclusive.");
                }
                addParam("s", Size.Value.ToString());
            }

            if (Rating != GravatarRating.Default)
            {
                addParam("r", Rating.ToString().ToLower());
            }

            if (DefaultImage != GravatarDefaultImage.Default)
            {
                if (DefaultImage == GravatarDefaultImage.Http404)
                {
                    addParam("d", "404");
                }
                else if (DefaultImage == GravatarDefaultImage.Identicon)
                {
                    addParam("d", "identicon");
                }
                if (DefaultImage == GravatarDefaultImage.MonsterId)
                {
                    addParam("d", "monsterid");
                }
                if (DefaultImage == GravatarDefaultImage.MysteryMan)
                {
                    addParam("d", "mm");
                }
                if (DefaultImage == GravatarDefaultImage.Wavatar)
                {
                    addParam("d", "wavatar");
                }
            }

            var tagBuilder = new TagBuilder("img");
            IDictionary <string, string> htmlAttributes = Shape.Attributes;
            IEnumerable <string>         classes        = Shape.Classes;
            string id = Shape.Id;

            tagBuilder.MergeAttributes(htmlAttributes, false);
            tagBuilder.Attributes.Add("src", url.ToString());

            foreach (var cssClass in classes ?? Enumerable.Empty <string>())
            {
                tagBuilder.AddCssClass(cssClass);
            }

            if (!string.IsNullOrWhiteSpace(id))
            {
                tagBuilder.GenerateId(id);
            }

            if (Size != null)
            {
                tagBuilder.Attributes.Add("width", Size.ToString());
                tagBuilder.Attributes.Add("height", Size.ToString());
            }

            return(MvcHtmlString.Create(tagBuilder.ToString()));
        }
示例#18
0
        /// <summary>
        ///   <para>Predefined type of image to be returned when user's email address has no matching Gravatar image.</para>
        /// </summary>
        /// <param name="widget">Widget to call method on.</param>
        /// <param name="image">Type of default image.</param>
        /// <returns>Reference to provided <paramref name="widget"/>.</returns>
        /// <exception cref="ArgumentNullException">If <paramref name="widget"/> is a <c>null</c> reference.</exception>
        /// <seealso cref="Default(IGravatarImageUrlWidget, string)"/>
        public static IGravatarImageUrlWidget Default(this IGravatarImageUrlWidget widget, GravatarDefaultImage image)
        {
            Assertion.NotNull(widget);

            switch (image)
            {
            case GravatarDefaultImage.Blank:
                return(widget.Default("blank"));

            case GravatarDefaultImage.IdentIcon:
                return(widget.Default("identicon"));

            case GravatarDefaultImage.MonsterId:
                return(widget.Default("monsterid"));

            case GravatarDefaultImage.MysteryMan:
                return(widget.Default("mm"));

            case GravatarDefaultImage.Retro:
                return(widget.Default("retro"));

            case GravatarDefaultImage.Wavatar:
                return(widget.Default("wavatar"));

            default:
                return(widget.Default("404"));
            }
        }
示例#19
0
        public static string Gravatar(this HtmlHelper html,
                                      string email,
                                      int?size = null,
                                      GravatarRating rating             = GravatarRating.Default,
                                      GravatarDefaultImage defaultImage = GravatarDefaultImage.MysteryMan,
                                      object htmlAttributes             = null)
        {
            var url = new StringBuilder("http://www.gravatar.com/avatar/", 90);

            url.Append(GetEmailHash(email));

            var isFirst = true;
            Action <string, string> addParam = (p, v) =>
            {
                url.Append(isFirst ? '?' : '&');
                isFirst = false;
                url.Append(p);
                url.Append('=');
                url.Append(v);
            };

            if (size != null)
            {
                if (size < 1 || size > 512)
                {
                    throw new ArgumentOutOfRangeException("size", size, "Must be null or between 1 and 512, inclusive.");
                }
                addParam("s", size.Value.ToString());
            }

            if (rating != GravatarRating.Default)
            {
                addParam("r", rating.ToString().ToLower());
            }

            if (defaultImage != GravatarDefaultImage.Default)
            {
                if (defaultImage == GravatarDefaultImage.Http404)
                {
                    addParam("d", "404");
                }
                else if (defaultImage == GravatarDefaultImage.Identicon)
                {
                    addParam("d", "identicon");
                }
                if (defaultImage == GravatarDefaultImage.MonsterId)
                {
                    addParam("d", "monsterid");
                }
                if (defaultImage == GravatarDefaultImage.MysteryMan)
                {
                    addParam("d", "mm");
                }
                if (defaultImage == GravatarDefaultImage.Wavatar)
                {
                    addParam("d", "wavatar");
                }
            }

            var tag = new TagBuilder("img");

            tag.MergeAttributes(new RouteValueDictionary(htmlAttributes));
            tag.Attributes.Add("src", url.ToString());

            if (size != null)
            {
                tag.Attributes.Add("width", size.ToString());
                tag.Attributes.Add("height", size.ToString());
            }

            return(tag.ToString());
        }
示例#20
0
        public static IHtmlString Gravatar(
            HtmlHelper Html,
            dynamic Shape,
            string Email,
            int? Size = null,
            GravatarRating Rating = GravatarRating.Default,
            GravatarDefaultImage DefaultImage = GravatarDefaultImage.MysteryMan) {

            var url = new StringBuilder("//www.gravatar.com/avatar/", 90);
            url.Append(GetEmailHash(Email));

            var isFirst = true;
            Action<string, string> addParam = (p, v) => {
                url.Append(isFirst ? '?' : '&');
                isFirst = false;
                url.Append(p);
                url.Append('=');
                url.Append(v);
            };

            if (Size != null) {
                if (Size < 1 || Size > 512)
                    throw new ArgumentOutOfRangeException("size", Size, "Must be null or between 1 and 512, inclusive.");
                addParam("s", Size.Value.ToString());
            }

            if (Rating != GravatarRating.Default)
                addParam("r", Rating.ToString().ToLower());

            if (DefaultImage != GravatarDefaultImage.Default) {
                if (DefaultImage == GravatarDefaultImage.Http404)
                    addParam("d", "404");
                else if (DefaultImage == GravatarDefaultImage.Identicon)
                    addParam("d", "identicon");
                if (DefaultImage == GravatarDefaultImage.MonsterId)
                    addParam("d", "monsterid");
                if (DefaultImage == GravatarDefaultImage.MysteryMan)
                    addParam("d", "mm");
                if (DefaultImage == GravatarDefaultImage.Wavatar)
                    addParam("d", "wavatar");
            }

            var tagBuilder = new TagBuilder("img");
            IDictionary<string, string> htmlAttributes = Shape.Attributes;
            IEnumerable<string> classes = Shape.Classes;
            string id = Shape.Id;

            tagBuilder.MergeAttributes(htmlAttributes, false);
            tagBuilder.Attributes.Add("src", url.ToString());

            foreach (var cssClass in classes ?? Enumerable.Empty<string>()) {
                tagBuilder.AddCssClass(cssClass);
            }

            if (!string.IsNullOrWhiteSpace(id)) {
                tagBuilder.GenerateId(id);
            }

            if (Size != null) {
                tagBuilder.Attributes.Add("width", Size.ToString());
                tagBuilder.Attributes.Add("height", Size.ToString());
            }

            return MvcHtmlString.Create(tagBuilder.ToString());
        }