⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commentviewbase.cs

📁 个人博客系统
💻 CS
字号:
#region Using

using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Globalization;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using BlogEngine.Core;

#endregion

namespace BlogEngine.Core.Web.Controls
{

  /// <summary>
  /// Inherit from this class when you are building the
  /// commentview.ascx user control in your custom theme.
  /// </summary>
  /// <remarks>
  /// The class exposes a lot of functionality to the custom
  /// comment control in the theme folder.
  /// </remarks>
  public class CommentViewBase : UserControl
  {

    #region Properties

    private Post _Post;

    /// <summary>
    /// Gets or sets the Post from which the comment belongs.
    /// </summary>
    /// <value>The Post object.</value>
    public Post Post
    {
      get { return _Post; }
      set { _Post = value; }
    }

    private Comment _Comment;

    /// <summary>
    /// Gets or sets the Comment.
    /// </summary>
    /// <value>The comment.</value>
    public Comment Comment
    {
      get { return _Comment; }
      set { _Comment = value; }
    }

    #endregion

    #region Methods

    /// <summary>
    /// The regular expression used to parse links.
    /// </summary>
    private static readonly Regex regex = new Regex("((http://|www\\.)([A-Z0-9.-]{1,})\\.[0-9A-Z?;~&#=\\-_\\./]{2,})", RegexOptions.Compiled | RegexOptions.IgnoreCase);
    private const string link = "<a href=\"{0}{1}\" rel=\"nofollow\">{2}</a>";

    /// <summary>
    /// Examins the comment body for any links and turns them
    /// automatically into one that can be clicked.
    /// <remarks>
    /// All links added to comments will have the rel attribute set
    /// to nofollow to prevent negative pagerank.
    /// </remarks>
    /// </summary>
    protected string ResolveLinks(string body)
    {
      if (string.IsNullOrEmpty(body))
        return body;

      CultureInfo info = CultureInfo.InvariantCulture;

      foreach (Match match in regex.Matches(body))
      {
        if (!match.Value.Contains("://"))
        {
          body = body.Replace(match.Value, string.Format(info, link, "http://", match.Value, ShortenUrl(match.Value, 50)));
        }
        else
        {
          body = body.Replace(match.Value, string.Format(info, link, string.Empty, match.Value, ShortenUrl(match.Value, 50)));
        }
      }

      body = body.Replace("\n", "<br />");

      ServingEventArgs arg = new ServingEventArgs(body, ServingLocation.SinglePost);
      Comment.OnServing(Comment, arg);

      return arg.Body;
    }

    /// <summary>
    /// Shortens any absolute URL to a specified maximum length
    /// </summary>
    private static string ShortenUrl(string url, int max)
    {
      if (url.Length <= max)
        return url;

      // Remove the protocal
      int startIndex = url.IndexOf("://");
      if (startIndex > -1)
        url = url.Substring(startIndex + 3);

      if (url.Length <= max)
        return url;

      // Compress folder structure
      int firstIndex = url.IndexOf("/") + 1;
      int lastIndex = url.LastIndexOf("/");
      if (firstIndex < lastIndex)
        url = url.Replace(url.Substring(firstIndex, lastIndex - firstIndex), "...");

      if (url.Length <= max)
        return url;

      // Remove URL parameters
      int queryIndex = url.IndexOf("?");
      if (queryIndex > -1)
        url = url.Substring(0, queryIndex);

      if (url.Length <= max)
        return url;

      // Remove URL fragment
      int fragmentIndex = url.IndexOf("#");
      if (fragmentIndex > -1)
        url = url.Substring(0, fragmentIndex);

      if (url.Length <= max)
        return url;

      // Compress page
      firstIndex = url.LastIndexOf("/") + 1;
      lastIndex = url.LastIndexOf(".");
      if (lastIndex - firstIndex > 10)
      {
        string page = url.Substring(firstIndex, lastIndex - firstIndex);
        int length = url.Length - max + 3;
        url = url.Replace(page, "..." + page.Substring(length));
      }

      return url;
    }

    /// <summary>
    /// Displays a delete link to visitors that are authenticated
    /// using the default membership provider.
    /// </summary>
    protected string AdminLinks
    {
      get
      {
        if (Page.User.Identity.IsAuthenticated)
        {
          BlogBasePage page = (BlogBasePage)Page;
          System.Text.StringBuilder sb = new System.Text.StringBuilder();
          sb.AppendFormat(" | <a href=\"mailto:{0}\">{0}</a>", Comment.Email);
          sb.AppendFormat(" | <a href=\"http://www.domaintools.com/go/?service=whois&amp;q={0}/\">{0}</a>", Comment.IP);
          string confirmDelete = string.Format(CultureInfo.InvariantCulture, page.Translate("areYouSure"), page.Translate("delete").ToLowerInvariant(), page.Translate("theComment"));
          sb.AppendFormat(" | <a href=\"?deletecomment={0}\" onclick=\"return confirm('{1}?')\">{2}</a>", Comment.Id, confirmDelete, page.Translate("delete"));

          if (!Comment.IsApproved)
          {
            sb.AppendFormat(" | <a href=\"?approvecomment={0}\">{1}</a>", Comment.Id, page.Translate("approve"));

          }
          return sb.ToString();
        }
        return string.Empty;
      }
    }

    /// <summary>
    /// Displays the flag of the country from which the comment was written.
    /// <remarks>
    /// If the country hasn't been resolved from the authors IP address or
    /// the flag does not exist for that country, nothing is displayed.
    /// </remarks>
    /// </summary>
    protected string Flag
    {
      get
      {
        if (!string.IsNullOrEmpty(Comment.Country))
        {
          string path = Server.MapPath("~/pics/flags/" + Comment.Country + ".png");
          if (File.Exists(path))
          {
            return "<img src=\"" + Utils.RelativeWebRoot + "pics/flags/" + Comment.Country + ".png\" class=\"flag\" alt=\"" + Comment.Country + "\" />";
          }
        }

        return null;
      }
    }

    /// <summary>
    /// Displays the Gravatar image that matches the specified email.
    /// </summary>
    protected string Gravatar(int size)
    {
      if (BlogSettings.Instance.Avatar == "none")
        return null;

      if (String.IsNullOrEmpty(Comment.Email) || !Comment.Email.Contains("@"))
      {
        if (Comment.Website != null && Comment.Website.ToString().Length > 0 && Comment.Website.ToString().Contains("http://"))
        {
          return string.Format(CultureInfo.InvariantCulture, "<img class=\"thumb\" src=\"http://images.websnapr.com/?url={0}&amp;size=t\" alt=\"{1}\" />", Server.UrlEncode(Comment.Website.ToString()), Comment.Email);
        }

        return "<img src=\"" + Utils.RelativeWebRoot + "themes/" + BlogSettings.Instance.Theme + "/noavatar.jpg\" alt=\"" + Comment.Author + "\" />";
      }

      string img = "<img src=\"{0}\" alt=\"{1}\" />";
      string hash = CreateMd5Hash();
      string noavatar = Utils.AbsoluteWebRoot + "themes/" + BlogSettings.Instance.Theme + "/noavatar.jpg";
      string monster = Utils.AbsoluteWebRoot + "monster.axd?seed=" + hash.Substring(0, 10) + "&size=" + size;
      string gravatar = "http://www.gravatar.com/avatar.php?gravatar_id=" + hash + "&amp;size=" + size + "&amp;default=";

      string link = string.Empty;
      switch (BlogSettings.Instance.Avatar)
      {
        case "monster":
          link = monster.Replace("&", "&amp;");
          break;

        case "gravatar":
          link = gravatar + Server.UrlEncode(noavatar);
          break;

        case "combine":
          link = gravatar + Server.UrlEncode(monster);
          break;
      }
      
      return string.Format(CultureInfo.InvariantCulture, img, link, Comment.Author);
    }

    private string CreateMd5Hash()
    {
      System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
      byte[] result = md5.ComputeHash(Encoding.ASCII.GetBytes(Comment.Email));

      System.Text.StringBuilder hash = new System.Text.StringBuilder();
      for (int i = 0; i < result.Length; i++)
      {
        hash.Append(result[i].ToString("x2", CultureInfo.InvariantCulture));
      }

      return hash.ToString();
    }
    #endregion

  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -