using System; using System.Globalization; using System.Text.RegularExpressions; using System.Web.Security; public class Comment { private static readonly Regex _linkRegex = new Regex("((http://|https://|www\\.)([A-Z0-9.\\-]{1,})\\.[0-9A-Z?;~&%\\(\\)#,=\\-_\\./\\+]{2,}[0-9A-Z?~&%#=\\-_/\\+])", RegexOptions.Compiled | RegexOptions.IgnoreCase); private const string Link = "{2}"; public Comment() { ID = Guid.NewGuid().ToString(); PubDate = DateTime.UtcNow; } public string ID { get; set; } public string Author { get; set; } public string Email { get; set; } public string Website { get; set; } public string Content { get; set; } public DateTime PubDate { get; set; } public string Ip { get; set; } public string UserAgent { get; set; } public bool IsAdmin { get; set; } public bool IsApproved { get; set; } public string GravatarUrl(int size) { var hash = FormsAuthentication.HashPasswordForStoringInConfigFile(Email.ToLowerInvariant(), "MD5").ToLower(); return string.Format("http://gravatar.com/avatar/{0}?s={1}&d=mm", hash, size); } public string ContentWithLinks() { return _linkRegex.Replace(Content, new MatchEvaluator(Evaluator)); } private static string Evaluator(Match match) { var info = CultureInfo.InvariantCulture; return string.Format(info, Link, !match.Value.Contains("://") ? "http://" : string.Empty, match.Value, ShortenUrl(match.Value, 50)); } private static string ShortenUrl(string url, int max) { if (url.Length <= max) { return url; } // Remove the protocal var startIndex = url.IndexOf("://"); if (startIndex > -1) { url = url.Substring(startIndex + 3); } if (url.Length <= max) { return url; } // Compress folder structure var firstIndex = url.IndexOf("/") + 1; var lastIndex = url.LastIndexOf("/"); if (firstIndex < lastIndex) { url = url.Remove(firstIndex, lastIndex - firstIndex); url = url.Insert(firstIndex, "..."); } if (url.Length <= max) { return url; } // Remove URL parameters var queryIndex = url.IndexOf("?"); if (queryIndex > -1) { url = url.Substring(0, queryIndex); } if (url.Length <= max) { return url; } // Remove URL fragment var 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) { var page = url.Substring(firstIndex, lastIndex - firstIndex); var length = url.Length - max + 3; if (page.Length > length) { url = url.Replace(page, string.Format("...{0}", page.Substring(length))); } } return url; } }