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 = "<a href=\"{0}{1}\" rel=\"nofollow\">{2}</a>";
|
|
|
|
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;
|
|
}
|
|
}
|