You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

118 lines
3.2 KiB

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;
}
}