dotnetblogengine扩展之Tag匹配
在dotnetblogengine 1.4 release中我提到wordpress的日志正文可以匹配已存在的tag,并进行url转换
试着在dotnetblogengine上写了一个扩展进行实现
代码如下:
今天发现dotnetblogengine的tag管理不大方便,有空写个东东:)
试着在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管理不大方便,有空写个东东:)
浙公网安备 33010602011771号