#region using using System; using System.Data; using System.Text.RegularExpressions; using BlogEngine.Core; using BlogEngine.Core.Web.Controls; #endregion /// /// Converts BBCode to XHTML in the comments. /// [Extension("Converts BBCode to XHTML in the comments", "1.0", "BlogEngine.NET")] public class BBCode { static protected ExtensionSettings _settings = null; static BBCode() { Comment.Serving += new EventHandler(Post_CommentServing); // create settings object. You need to pass exactly your // extension class name (case sencitive) ExtensionSettings settings = new ExtensionSettings("BBCode"); //----------------------------------------------------- // 1. Simple //----------------------------------------------------- //settings.AddParameter("Code"); //settings.AddParameter("OpenTag"); //settings.AddParameter("CloseTag"); //----------------------------------------------------- // 2. Some more options //----------------------------------------------------- //settings.AddParameter("Code"); //settings.AddParameter("OpenTag", "Open Tag"); //settings.AddParameter("CloseTag", "Close Tag"); //// describe specific rules applied to entering parameters. overrides default wording. //settings.Help = "Converts BBCode to XHTML in the comments. Close tag is optional."; //----------------------------------------------------- // 3. More options including import defaults //----------------------------------------------------- settings.AddParameter("Code", "Code", 20, true); settings.AddParameter("OpenTag", "Open Tag", 150, true); settings.AddParameter("CloseTag", "Close Tag"); // describe specific rules for entering parameters settings.Help = "Converts BBCode to XHTML in the comments. Close tag is optional."; settings.AddValues(new string[] { "b", "strong", "" }); settings.AddValues(new string[] { "i", "em", "" }); settings.AddValues(new string[] { "u", "span style=\"text-decoration:underline\"", "span" }); settings.AddValues(new string[] { "quote", "cite title=\"Quote\"", "cite" }); //------------------------------------------------------ ExtensionManager.ImportSettings(settings); _settings = ExtensionManager.GetSettings("BBCode"); } /// /// The event handler that is triggered every time a comment is served to a client. /// private static void Post_CommentServing(object sender, ServingEventArgs e) { string body = e.Body; // retrieve parameters back as a data table // column = parameter DataTable table = _settings.GetDataTable(); foreach (DataRow row in table.Rows) { if (string.IsNullOrEmpty((string)row["CloseTag"])) Parse(ref body, (string)row["Code"], (string)row["OpenTag"]); else Parse(ref body, (string)row["Code"], (string)row["OpenTag"], (string)row["CloseTag"]); } e.Body = body; } private static void Parse(ref string body, string code, string tag) { Parse(ref body, code, tag, tag); } /// /// Parses the BBCode into XHTML in a safe non-breaking manor. /// private static void Parse(ref string body, string code, string startTag, string endTag) { int start = body.IndexOf("[" + code + "]"); if (start > -1) { if (body.IndexOf("[/" + code + "]", start) > -1) { body = body.Remove(start, code.Length + 2); body = body.Insert(start, "<" + startTag + ">"); int end = body.IndexOf("[/" + code + "]", start); body = body.Remove(end, code.Length + 3); body = body.Insert(end, ""); Parse(ref body, code, startTag); } } } }