From 4630269e60b71ccd2756d0360e41fb7c1023979d Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Thu, 9 Aug 2012 18:14:19 -0700 Subject: [PATCH] Optimizing Bbcode filter --HG-- branch : 1.x --- .../Orchard.Core.Tests.csproj | 1 + .../Core/Common/Services/BbcodeFilter.cs | 115 ++++++++++++++---- 2 files changed, 93 insertions(+), 23 deletions(-) diff --git a/src/Orchard.Core.Tests/Orchard.Core.Tests.csproj b/src/Orchard.Core.Tests/Orchard.Core.Tests.csproj index 97aa09ed7..dc1c81a42 100644 --- a/src/Orchard.Core.Tests/Orchard.Core.Tests.csproj +++ b/src/Orchard.Core.Tests/Orchard.Core.Tests.csproj @@ -107,6 +107,7 @@ + diff --git a/src/Orchard.Web/Core/Common/Services/BbcodeFilter.cs b/src/Orchard.Web/Core/Common/Services/BbcodeFilter.cs index 4f56b724d..a58753b51 100644 --- a/src/Orchard.Web/Core/Common/Services/BbcodeFilter.cs +++ b/src/Orchard.Web/Core/Common/Services/BbcodeFilter.cs @@ -1,4 +1,7 @@ -using System.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; using System.Text.RegularExpressions; using System.Web; using Orchard.Services; @@ -14,31 +17,97 @@ namespace Orchard.Core.Common.Services { if (string.IsNullOrEmpty(text)) return string.Empty; - var urlRegex = new Regex(@"\[url\]([^\]]+)\[\/url\]"); - var urlRegexWithLink = new Regex(@"\[url=([^\]]+)\]([^\]]+)\[\/url\]"); - var imgRegex = new Regex(@"\[img\]([^\]]+)\[\/img\]"); - - text = urlRegex.Replace(text, "$1"); - text = urlRegexWithLink.Replace(text, "$2"); - - var matches = imgRegex.Matches(text).OfType().OrderByDescending(m => m.Groups[0].Index); - foreach(var match in matches) { - var index = match.Groups[0].Index; - var length = match.Groups[0].Length; - var url = match.Groups[1].Value.Trim(); - if (!string.IsNullOrEmpty(url)) { - if (url[0]=='~') - url = VirtualPathUtility.ToAbsolute(url); - text = - text.Substring(0, index) + - string.Format("", url) + - text.Substring(index + length); - } + // optimize code path if nothing to do + if (!text.Contains("[url]") && !text.Contains("[img]") && !text.Contains("[url=")) { + return text; } - text = imgRegex.Replace(text, ""); + var sb = new StringBuilder(text); - return text; + var index = -1; + var allIndexes = new List(); + + // process all [url] + while (-1 != (index = text.IndexOf("[url]", index + 1, StringComparison.Ordinal))) { + allIndexes.Add(index); + } + + foreach(var start in allIndexes) { + var end = text.IndexOf("[/url]", start, StringComparison.Ordinal); + var url = text.Substring(start + 5 , end - start - 5); + + // substitue [url] by + sb.Remove(start, end - start + 6); + sb.Insert(start, String.Format("{0}", url)); + } + + // [url={url}] + index = -1; + allIndexes.Clear(); + + while (-1 != (index = text.IndexOf("[url=", index + 1, StringComparison.Ordinal))) { + allIndexes.Add(index); + } + + foreach (var start in allIndexes) { + var urlEnd = text.IndexOf("]", start, StringComparison.Ordinal); + var end = text.IndexOf("[/url]", start, StringComparison.Ordinal); + var url = text.Substring(start + 5, urlEnd - start - 5); + var title = text.Substring(urlEnd + 1, end - urlEnd - 1); + + // substitue [url] by + sb.Remove(start, end - start + 6); + sb.Insert(start, String.Format("{1}", url, title)); + } + + // [img] + index = -1; + allIndexes.Clear(); + + while (-1 != (index = text.IndexOf("[img]", index + 1, StringComparison.Ordinal))) { + allIndexes.Add(index); + } + + foreach (var start in allIndexes) { + var end = text.IndexOf("[/img]", start, StringComparison.Ordinal); + var url = text.Substring(start + 5, end - start - 5); + + // substitue [url] by + sb.Remove(start, end - start + 6); + + if (!string.IsNullOrEmpty(url)) { + if (url[0] == '~') + url = VirtualPathUtility.ToAbsolute(url); + } + + sb.Insert(start, String.Format("", url)); + } + + //var urlRegex = new Regex(@"\[url\]([^\]]+)\[\/url\]"); + //var urlRegexWithLink = new Regex(@"\[url=([^\]]+)\]([^\]]+)\[\/url\]"); + //var imgRegex = new Regex(@"\[img\]([^\]]+)\[\/img\]"); + + //text = urlRegex.Replace(text, "$1"); + //text = urlRegexWithLink.Replace(text, "$2"); + + //var matches = imgRegex.Matches(text).OfType().OrderByDescending(m => m.Groups[0].Index); + //foreach(var match in matches) { + // var index2 = match.Groups[0].Index; + // var length = match.Groups[0].Length; + // var url = match.Groups[1].Value.Trim(); + // if (!string.IsNullOrEmpty(url)) { + // if (url[0]=='~') + // url = VirtualPathUtility.ToAbsolute(url); + // text = + // text.Substring(0, index2) + + // string.Format("", url) + + // text.Substring(index2 + length); + // } + //} + + //text = imgRegex.Replace(text, ""); + + return sb.ToString(); } } } \ No newline at end of file