在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管理不大方便,有空写个东东:)

Write a comment:



(将显示你的Gravatar图标)  



[b][/b] - [i][/i] - [u][/u]- [quote][/quote]

:-/ ^_^ :d :o :kiss: :) :p :se: [yeah] :( :love: :han: :up: :cry: :zzz: o_o

评论提交有问题?