在dotnetblogengine 1.4 release中我提到wordpress的日志正文可以匹配已存在的tag,并进行url转换
试着在dotnetblogengine上写了一个扩展进行实现
代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using BlogEngine.Core;
using System.Text.RegularExpressions;
/// <summary>
/// KeyTransfor 的摘要说明
/// </summary>
[BlogEngine.Core.Web.Controls.Extension("链接粘合度,替换tag", "1.0", "jason")]
public class KeyTransfor
{
private static StateList<LinkRelating> _sl = null;
public static readonly object Syncobj = new object();
static Regex reg = new Regex(@"^\d+$", RegexOptions.Compiled); //这里我不想匹配纯数字的tag
static KeyTransfor()
{
lock (Syncobj)
{
if (_sl == null)
{
lock (Syncobj)
{
LoadTags();
}
}
}
}
static void LoadTags()
{
_sl = new StateList<LinkRelating>();
LinkRelating lnk;
foreach (Post p in Post.Posts.FindAll(delegate(Post post)
{
return post.IsPublished == true && post.IsVisible == true;
}))
{
foreach (string tag in p.Tags)
{
if (string.IsNullOrEmpty(tag)) continue;
if (reg.IsMatch(tag)) continue;
lnk = new LinkRelating(tag, string.Format(@"<a href=""{0}"" target=""_blank"">{1}</a>", Utils.RelativeWebRoot + "?tag=/" + HttpUtility.UrlEncode(tag), tag));
if (!_sl.Contains(lnk))
_sl.Add(lnk);
}
lnk = new LinkRelating(p.Title, string.Format(@"<a href=""{0}"" target=""_blank"">{1}</a>", p.AbsoluteLink, p.Title));
if (!_sl.Contains(lnk)) _sl.Add(lnk);
}
_sl.TrimExcess();
}
public KeyTransfor()
{
//
// TODO: 在此处添加构造函数逻辑
//
Post.Serving += new EventHandler<ServingEventArgs>(Post_Serving);
//当添加一篇新日志时引发Saved事件,从而将缓存进行重载
Post.Saved += new EventHandler<SavedEventArgs>(Post_Saved);
}
void Post_Saved(object sender, SavedEventArgs e)
{
LoadTags();
}
void Post_Serving(object sender, ServingEventArgs e)
{
if (e.Location == ServingLocation.SinglePost)
{
string body = e.Body;
foreach (LinkRelating lnk in _sl)
{
if (reg.IsMatch(lnk.Key)) continue;
e.Body = e.Body.Replace(lnk.Key, lnk.Href);
}
}
}
}
public struct LinkRelating
{
private string _key;
public string Key
{
get { return _key; }
set { _key = value; }
}
private string _href;
public string Href
{
get { return _href; }
set { _href = value; }
}
public LinkRelating(string key, string href)
{
_href = href;
_key = key;
}
}
今天发现dotnetblogengine的tag管理不大方便,有空写个东东:)