From aa1534cac4ac376ad39591bbe535a295838ba4e4 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Wed, 1 May 2013 16:05:27 -0700 Subject: [PATCH] Adding #{} tokens support --HG-- branch : 1.x --- .../Implementation/Tokenizer.cs | 23 +++++++++++++++--- .../Orchard.Tokens/Tests/TokenizerTests.cs | 24 +++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Tokens/Implementation/Tokenizer.cs b/src/Orchard.Web/Modules/Orchard.Tokens/Implementation/Tokenizer.cs index de648cdb7..a5fcde990 100644 --- a/src/Orchard.Web/Modules/Orchard.Tokens/Implementation/Tokenizer.cs +++ b/src/Orchard.Web/Modules/Orchard.Tokens/Implementation/Tokenizer.cs @@ -41,21 +41,38 @@ namespace Orchard.Tokens.Implementation { } public string Replace(string text, IDictionary data, ReplaceOptions options) { - var tokenset = Parse(text); + + // do we have to replace tokens with hashes ? + bool hashMode = text.Contains("#{"); + + var tokenset = Parse(text, hashMode); var tokens = tokenset.Item2; var replacements = Evaluate(options.Predicate == null ? tokens : tokens.Where(options.Predicate), data); return replacements.Aggregate(tokenset.Item1, - (current, replacement) => current.Replace("{" + replacement.Key + "}", (options.Encoding ?? ReplaceOptions.NoEncode)(replacement.Key, replacement.Value))); + (current, replacement) => current.Replace((hashMode ? "#{" : "{") + replacement.Key + "}", (options.Encoding ?? ReplaceOptions.NoEncode)(replacement.Key, replacement.Value))); } - private static Tuple> Parse(string text) { + private static Tuple> Parse(string text, bool hashMode) { var tokens = new List(); if (!string.IsNullOrEmpty(text)) { var inToken = false; var tokenStart = 0; for (var i = 0; i < text.Length; i++) { var c = text[i]; + + if (!inToken && hashMode) { + if (c == '#' && i + 1 < text.Length) { + c = text[i + 1]; + if (c == '{') { + i++; + } + else { + continue; + } + } + } + if (c == '{') { if (i + 1 < text.Length && text[i + 1] == '{') { text = text.Substring(0, i) + text.Substring(i + 1); diff --git a/src/Orchard.Web/Modules/Orchard.Tokens/Tests/TokenizerTests.cs b/src/Orchard.Web/Modules/Orchard.Tokens/Tests/TokenizerTests.cs index 0b73be53c..092593d99 100644 --- a/src/Orchard.Web/Modules/Orchard.Tokens/Tests/TokenizerTests.cs +++ b/src/Orchard.Web/Modules/Orchard.Tokens/Tests/TokenizerTests.cs @@ -76,5 +76,29 @@ namespace Orchard.Tokens.Tests { public void TestPredicate() { Assert.That(_tokenizer.Replace("{Site.Global1}{Site.Global2}", null, new ReplaceOptions { Predicate = token => token == "Site.Global2" }), Is.EqualTo("{Site.Global1}[global2]")); } + + [Test] + public void HashTokenShouldBeReplaced() { + Assert.That(_tokenizer.Replace("foo #{Site.Global1}", null), Is.EqualTo("foo [global1]")); + Assert.That(_tokenizer.Replace("#{Site.Global1}#{Site.Global2}", null), Is.EqualTo("[global1][global2]")); + } + + [Test] + public void HashInsideTokenShouldBeIgnored() { + Assert.That(_tokenizer.Replace("{Site.Global1.#}", null), Is.EqualTo("")); + Assert.That(_tokenizer.Replace("#{Site.Global1.#}", null), Is.EqualTo("")); + } + + [Test] + public void SimplePatterShouldBeIgnoredWhenHashIsPresent() { + Assert.That(_tokenizer.Replace("#{Site.Global1}", null), Is.EqualTo("[global1]")); + Assert.That(_tokenizer.Replace("{Site.Global1}#{Site.Global1}", null), Is.EqualTo("{Site.Global1}[global1]")); + } + + [Test] + public void HashPatternCanBeEscaped() { + Assert.That(_tokenizer.Replace("##{Site.Global1}", null), Is.EqualTo("#[global1]")); + Assert.That(_tokenizer.Replace("#{{Site.Global1}}", null), Is.EqualTo("#{Site.Global1}")); + } } }