diff --git a/src/Umbraco.Tests/Templates/LocalLinkParserTests.cs b/src/Umbraco.Tests/Templates/LocalLinkParserTests.cs
new file mode 100644
index 0000000000..30c79b3115
--- /dev/null
+++ b/src/Umbraco.Tests/Templates/LocalLinkParserTests.cs
@@ -0,0 +1,34 @@
+using NUnit.Framework;
+using System.Linq;
+using Umbraco.Core;
+using Umbraco.Tests.Testing.Objects.Accessors;
+using Umbraco.Web.Templates;
+
+namespace Umbraco.Tests.Templates
+{
+ [TestFixture]
+ public class LocalLinkParserTests
+ {
+ [Test]
+ public void Returns_Udis_From_LocalLinks()
+ {
+ var input = @"
+
+
+hello
+
";
+
+ var umbracoContextAccessor = new TestUmbracoContextAccessor();
+ var parser = new LocalLinkParser(umbracoContextAccessor);
+
+ var result = parser.FindUdisFromLocalLinks(input).ToList();
+
+ Assert.AreEqual(2, result.Count);
+ Assert.AreEqual(Udi.Parse("umb://document/C093961595094900AAF9170DDE6AD442"), result[0]);
+ Assert.AreEqual(Udi.Parse("umb://document-type/2D692FCB070B4CDA92FB6883FDBFD6E2"), result[1]);
+ }
+ }
+}
diff --git a/src/Umbraco.Tests/Templates/UdiParserTests.cs b/src/Umbraco.Tests/Templates/UdiParserTests.cs
deleted file mode 100644
index eca7f6c4f0..0000000000
--- a/src/Umbraco.Tests/Templates/UdiParserTests.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using NUnit.Framework;
-using Umbraco.Web.Templates;
-using System.Linq;
-using Umbraco.Core;
-
-namespace Umbraco.Tests.Templates
-{
- [TestFixture]
- public class UdiParserTests
- {
- [Test]
- public void Returns_Udi_From_Data_Udi_Html_Attributes()
- {
- var input = @"
-
-

-
-

";
-
- var parser = new UdiParser();
- var result = parser.ParseUdisFromDataAttributes(input).ToList();
- Assert.AreEqual(2, result.Count);
- Assert.AreEqual(Udi.Parse("umb://media/D4B18427A1544721B09AC7692F35C264"), result[0]);
- Assert.AreEqual(Udi.Parse("umb://media-type/B726D735E4C446D58F703F3FBCFC97A5"), result[1]);
- }
-
- }
-}
diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj
index 519f36012c..d9583b9393 100644
--- a/src/Umbraco.Tests/Umbraco.Tests.csproj
+++ b/src/Umbraco.Tests/Umbraco.Tests.csproj
@@ -159,7 +159,7 @@
-
+
@@ -256,7 +256,7 @@
-
+
diff --git a/src/Umbraco.Tests/Web/InternalLinkParserTests.cs b/src/Umbraco.Tests/Web/InternalLinkParserTests.cs
index 0a948a8617..49da8d6566 100644
--- a/src/Umbraco.Tests/Web/InternalLinkParserTests.cs
+++ b/src/Umbraco.Tests/Web/InternalLinkParserTests.cs
@@ -65,7 +65,7 @@ namespace Umbraco.Tests.Web
mediaCache.Setup(x => x.GetById(It.IsAny
())).Returns(media.Object);
mediaCache.Setup(x => x.GetById(It.IsAny())).Returns(media.Object);
- var linkParser = new InternalLinkParser(umbracoContextAccessor);
+ var linkParser = new LocalLinkParser(umbracoContextAccessor);
var output = linkParser.EnsureInternalLinks(input);
diff --git a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs
index bec28e33fd..fa6346fdd8 100644
--- a/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs
+++ b/src/Umbraco.Web/PropertyEditors/GridPropertyEditor.cs
@@ -28,10 +28,10 @@ namespace Umbraco.Web.PropertyEditors
private IMediaService _mediaService;
private IContentTypeBaseServiceProvider _contentTypeBaseServiceProvider;
private IUmbracoContextAccessor _umbracoContextAccessor;
- private readonly MediaParser _mediaParser;
+ private readonly ImageSourceParser _mediaParser;
private ILogger _logger;
- public GridPropertyEditor(ILogger logger, IMediaService mediaService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, IUmbracoContextAccessor umbracoContextAccessor, MediaParser mediaParser)
+ public GridPropertyEditor(ILogger logger, IMediaService mediaService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, IUmbracoContextAccessor umbracoContextAccessor, ImageSourceParser mediaParser)
: base(logger)
{
_mediaService = mediaService;
@@ -57,9 +57,9 @@ namespace Umbraco.Web.PropertyEditors
private IContentTypeBaseServiceProvider _contentTypeBaseServiceProvider;
private IUmbracoContextAccessor _umbracoContextAccessor;
private ILogger _logger;
- private readonly MediaParser _mediaParser;
+ private readonly ImageSourceParser _mediaParser;
- public GridPropertyValueEditor(DataEditorAttribute attribute, IMediaService mediaService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, IUmbracoContextAccessor umbracoContextAccessor, ILogger logger, MediaParser _mediaParser)
+ public GridPropertyValueEditor(DataEditorAttribute attribute, IMediaService mediaService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, IUmbracoContextAccessor umbracoContextAccessor, ILogger logger, ImageSourceParser _mediaParser)
: base(attribute)
{
_mediaService = mediaService;
diff --git a/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs
index 03dc7b6694..4c7df4163c 100644
--- a/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs
+++ b/src/Umbraco.Web/PropertyEditors/RichTextPropertyEditor.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Linq;
using Umbraco.Core;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
@@ -25,12 +26,13 @@ namespace Umbraco.Web.PropertyEditors
public class RichTextPropertyEditor : DataEditor
{
private IUmbracoContextAccessor _umbracoContextAccessor;
- private readonly MediaParser _mediaParser;
+ private readonly ImageSourceParser _mediaParser;
+
///
/// The constructor will setup the property editor based on the attribute if one is found
///
- public RichTextPropertyEditor(ILogger logger, IUmbracoContextAccessor umbracoContextAccessor, MediaParser mediaParser)
+ public RichTextPropertyEditor(ILogger logger, IUmbracoContextAccessor umbracoContextAccessor, ImageSourceParser mediaParser)
: base(logger)
{
_umbracoContextAccessor = umbracoContextAccessor;
@@ -53,9 +55,9 @@ namespace Umbraco.Web.PropertyEditors
internal class RichTextPropertyValueEditor : DataValueEditor, IDataValueReference
{
private IUmbracoContextAccessor _umbracoContextAccessor;
- private readonly MediaParser _mediaParser;
+ private readonly ImageSourceParser _mediaParser;
- public RichTextPropertyValueEditor(DataEditorAttribute attribute, IUmbracoContextAccessor umbracoContextAccessor, MediaParser _mediaParser)
+ public RichTextPropertyValueEditor(DataEditorAttribute attribute, IUmbracoContextAccessor umbracoContextAccessor, ImageSourceParser _mediaParser)
: base(attribute)
{
_umbracoContextAccessor = umbracoContextAccessor;
@@ -127,7 +129,7 @@ namespace Umbraco.Web.PropertyEditors
///
public IEnumerable GetReferences(object value)
{
- throw new NotImplementedException();
+ return _mediaParser.FindUdisFromDataAttributes(value == null ? string.Empty : value is string str ? str : value.ToString()).ToList();
}
}
diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/MarkdownEditorValueConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/MarkdownEditorValueConverter.cs
index 578a4cad06..e8a2ac11a6 100644
--- a/src/Umbraco.Web/PropertyEditors/ValueConverters/MarkdownEditorValueConverter.cs
+++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/MarkdownEditorValueConverter.cs
@@ -12,10 +12,10 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
[DefaultPropertyValueConverter]
public class MarkdownEditorValueConverter : PropertyValueConverterBase
{
- private readonly InternalLinkParser _localLinkParser;
+ private readonly LocalLinkParser _localLinkParser;
private readonly UrlParser _urlResolver;
- public MarkdownEditorValueConverter(InternalLinkParser localLinkParser, UrlParser urlResolver)
+ public MarkdownEditorValueConverter(LocalLinkParser localLinkParser, UrlParser urlResolver)
{
_localLinkParser = localLinkParser;
_urlResolver = urlResolver;
diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs
index 88c1429b16..2caac9e1f4 100644
--- a/src/Umbraco.Web/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs
+++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs
@@ -24,9 +24,9 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
{
private readonly IUmbracoContextAccessor _umbracoContextAccessor;
private readonly IMacroRenderer _macroRenderer;
- private readonly InternalLinkParser _internalLinkParser;
+ private readonly LocalLinkParser _internalLinkParser;
private readonly UrlParser _urlResolver;
- private readonly MediaParser _mediaParser;
+ private readonly ImageSourceParser _mediaParser;
public override PropertyCacheLevel GetPropertyCacheLevel(IPublishedPropertyType propertyType)
{
@@ -36,7 +36,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
}
public RteMacroRenderingValueConverter(IUmbracoContextAccessor umbracoContextAccessor, IMacroRenderer macroRenderer,
- InternalLinkParser internalLinkParser, UrlParser urlResolver, MediaParser mediaParser)
+ LocalLinkParser internalLinkParser, UrlParser urlResolver, ImageSourceParser mediaParser)
{
_umbracoContextAccessor = umbracoContextAccessor;
_macroRenderer = macroRenderer;
diff --git a/src/Umbraco.Web/PropertyEditors/ValueConverters/TextStringValueConverter.cs b/src/Umbraco.Web/PropertyEditors/ValueConverters/TextStringValueConverter.cs
index 1b85d6e608..5efc2ee2db 100644
--- a/src/Umbraco.Web/PropertyEditors/ValueConverters/TextStringValueConverter.cs
+++ b/src/Umbraco.Web/PropertyEditors/ValueConverters/TextStringValueConverter.cs
@@ -11,7 +11,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
[DefaultPropertyValueConverter]
public class TextStringValueConverter : PropertyValueConverterBase
{
- public TextStringValueConverter(InternalLinkParser internalLinkParser, UrlParser urlParser)
+ public TextStringValueConverter(LocalLinkParser internalLinkParser, UrlParser urlParser)
{
_internalLinkParser = internalLinkParser;
_urlParser = urlParser;
@@ -22,7 +22,7 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
Constants.PropertyEditors.Aliases.TextBox,
Constants.PropertyEditors.Aliases.TextArea
};
- private readonly InternalLinkParser _internalLinkParser;
+ private readonly LocalLinkParser _internalLinkParser;
private readonly UrlParser _urlParser;
public override bool IsConverter(IPublishedPropertyType propertyType)
diff --git a/src/Umbraco.Web/Runtime/WebInitialComposer.cs b/src/Umbraco.Web/Runtime/WebInitialComposer.cs
index 1b3128388d..2f78ac9732 100644
--- a/src/Umbraco.Web/Runtime/WebInitialComposer.cs
+++ b/src/Umbraco.Web/Runtime/WebInitialComposer.cs
@@ -107,9 +107,9 @@ namespace Umbraco.Web.Runtime
composition.RegisterUnique();
composition.RegisterUnique();
- composition.RegisterUnique();
+ composition.RegisterUnique();
composition.RegisterUnique();
- composition.RegisterUnique();
+ composition.RegisterUnique();
// register the umbraco helper - this is Transient! very important!
// also, if not level.Run, we cannot really use the helper (during upgrade...)
diff --git a/src/Umbraco.Web/Templates/MediaParser.cs b/src/Umbraco.Web/Templates/ImageSourceParser.cs
similarity index 86%
rename from src/Umbraco.Web/Templates/MediaParser.cs
rename to src/Umbraco.Web/Templates/ImageSourceParser.cs
index 071c6a5696..6a0bba4998 100644
--- a/src/Umbraco.Web/Templates/MediaParser.cs
+++ b/src/Umbraco.Web/Templates/ImageSourceParser.cs
@@ -14,9 +14,9 @@ using Umbraco.Web.Routing;
namespace Umbraco.Web.Templates
{
- public sealed class MediaParser
+ public sealed class ImageSourceParser
{
- public MediaParser(IUmbracoContextAccessor umbracoContextAccessor, ILogger logger, IMediaService mediaService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider)
+ public ImageSourceParser(IUmbracoContextAccessor umbracoContextAccessor, ILogger logger, IMediaService mediaService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider)
{
_umbracoContextAccessor = umbracoContextAccessor;
_logger = logger;
@@ -32,6 +32,27 @@ namespace Umbraco.Web.Templates
private readonly IContentTypeBaseServiceProvider _contentTypeBaseServiceProvider;
const string TemporaryImageDataAttribute = "data-tmpimg";
+ private static readonly Regex DataUdiAttributeRegex = new Regex(@"data-udi=\\?(?:""|')(?umb://[A-z0-9\-]+/[A-z0-9]+)\\?(?:""|')",
+ RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
+
+ ///
+ /// Parses out UDIs from an html string based on 'data-udi' html attributes
+ ///
+ ///
+ ///
+ public IEnumerable FindUdisFromDataAttributes(string text)
+ {
+ var matches = DataUdiAttributeRegex.Matches(text);
+ if (matches.Count == 0)
+ yield break;
+
+ foreach (Match match in matches)
+ {
+ if (match.Groups.Count == 2 && Udi.TryParse(match.Groups[1].Value, out var udi))
+ yield return udi;
+ }
+ }
+
///
/// Parses the string looking for Umbraco image tags and updates them to their up-to-date image sources.
///
@@ -178,7 +199,7 @@ namespace Umbraco.Web.Templates
}
catch (Exception ex)
{
- _logger.Error(typeof(MediaParser), ex, "Could not delete temp file or folder {FileName}", absoluteTempImagePath);
+ _logger.Error(typeof(ImageSourceParser), ex, "Could not delete temp file or folder {FileName}", absoluteTempImagePath);
}
}
}
diff --git a/src/Umbraco.Web/Templates/InternalLinkParser.cs b/src/Umbraco.Web/Templates/LocalLinkParser.cs
similarity index 63%
rename from src/Umbraco.Web/Templates/InternalLinkParser.cs
rename to src/Umbraco.Web/Templates/LocalLinkParser.cs
index 32d7d42eac..f394f56d85 100644
--- a/src/Umbraco.Web/Templates/InternalLinkParser.cs
+++ b/src/Umbraco.Web/Templates/LocalLinkParser.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
using System.Text.RegularExpressions;
using Umbraco.Core;
using Umbraco.Core.Logging;
@@ -10,7 +11,7 @@ namespace Umbraco.Web.Templates
///
/// Utility class used to parse internal links
///
- public sealed class InternalLinkParser
+ public sealed class LocalLinkParser
{
private static readonly Regex LocalLinkPattern = new Regex(@"href=""[/]?(?:\{|\%7B)localLink:([a-zA-Z0-9-://]+)(?:\}|\%7D)",
@@ -18,11 +19,20 @@ namespace Umbraco.Web.Templates
private readonly IUmbracoContextAccessor _umbracoContextAccessor;
- public InternalLinkParser(IUmbracoContextAccessor umbracoContextAccessor)
+ public LocalLinkParser(IUmbracoContextAccessor umbracoContextAccessor)
{
_umbracoContextAccessor = umbracoContextAccessor;
}
+ internal IEnumerable FindUdisFromLocalLinks(string text)
+ {
+ foreach ((int? intId, GuidUdi udi, string tagValue) in FindLocalLinkIds(text))
+ {
+ if (udi != null)
+ yield return udi; // In v8, we only care abuot UDIs
+ }
+ }
+
///
/// Parses the string looking for the {localLink} syntax and updates them to their correct links.
///
@@ -56,6 +66,33 @@ namespace Umbraco.Web.Templates
var urlProvider = _umbracoContextAccessor.UmbracoContext.UrlProvider;
+ foreach((int? intId, GuidUdi udi, string tagValue) in FindLocalLinkIds(text))
+ {
+ if (udi != null)
+ {
+ var newLink = "#";
+ if (udi.EntityType == Constants.UdiEntityType.Document)
+ newLink = urlProvider.GetUrl(udi.Guid);
+ else if (udi.EntityType == Constants.UdiEntityType.Media)
+ newLink = urlProvider.GetMediaUrl(udi.Guid);
+
+ if (newLink == null)
+ newLink = "#";
+
+ text = text.Replace(tagValue, "href=\"" + newLink);
+ }
+ else if (intId.HasValue)
+ {
+ var newLink = urlProvider.GetUrl(intId.Value);
+ text = text.Replace(tagValue, "href=\"" + newLink);
+ }
+ }
+
+ return text;
+ }
+
+ private IEnumerable<(int? intId, GuidUdi udi, string tagValue)> FindLocalLinkIds(string text)
+ {
// Parse internal links
var tags = LocalLinkPattern.Matches(text);
foreach (Match tag in tags)
@@ -69,29 +106,16 @@ namespace Umbraco.Web.Templates
{
var guidUdi = udi as GuidUdi;
if (guidUdi != null)
- {
- var newLink = "#";
- if (guidUdi.EntityType == Constants.UdiEntityType.Document)
- newLink = urlProvider.GetUrl(guidUdi.Guid);
- else if (guidUdi.EntityType == Constants.UdiEntityType.Media)
- newLink = urlProvider.GetMediaUrl(guidUdi.Guid);
-
- if (newLink == null)
- newLink = "#";
-
- text = text.Replace(tag.Value, "href=\"" + newLink);
- }
+ yield return (null, guidUdi, tag.Value);
}
if (int.TryParse(id, out var intId))
{
- var newLink = urlProvider.GetUrl(intId);
- text = text.Replace(tag.Value, "href=\"" + newLink);
+ yield return (intId, null, tag.Value);
}
}
}
- return text;
}
}
}
diff --git a/src/Umbraco.Web/Templates/TemplateUtilities.cs b/src/Umbraco.Web/Templates/TemplateUtilities.cs
index d4bae38147..db0366dbf3 100644
--- a/src/Umbraco.Web/Templates/TemplateUtilities.cs
+++ b/src/Umbraco.Web/Templates/TemplateUtilities.cs
@@ -31,7 +31,7 @@ namespace Umbraco.Web.Templates
[Obsolete("Inject and use an instance of InternalLinkParser instead")]
public static string ParseInternalLinks(string text, UrlProvider urlProvider)
- => Current.Factory.GetInstance().EnsureInternalLinks(text);
+ => Current.Factory.GetInstance().EnsureInternalLinks(text);
[Obsolete("Inject and use an instance of UrlResolver")]
public static string ResolveUrlsFromTextString(string text)
@@ -43,14 +43,14 @@ namespace Umbraco.Web.Templates
[Obsolete("Use MediaParser.EnsureImageSources instead")]
public static string ResolveMediaFromTextString(string text)
- => Current.Factory.GetInstance().EnsureImageSources(text);
+ => Current.Factory.GetInstance().EnsureImageSources(text);
[Obsolete("Use MediaParser.RemoveImageSources instead")]
internal static string RemoveMediaUrlsFromTextString(string text)
- => Current.Factory.GetInstance().RemoveImageSources(text);
+ => Current.Factory.GetInstance().RemoveImageSources(text);
[Obsolete("Use MediaParser.RemoveImageSources instead")]
internal static string FindAndPersistPastedTempImages(string html, Guid mediaParentFolder, int userId, IMediaService mediaService, IContentTypeBaseServiceProvider contentTypeBaseServiceProvider, ILogger logger)
- => Current.Factory.GetInstance().FindAndPersistPastedTempImages(html, mediaParentFolder, userId);
+ => Current.Factory.GetInstance().FindAndPersistPastedTempImages(html, mediaParentFolder, userId);
}
}
diff --git a/src/Umbraco.Web/Templates/UdiParser.cs b/src/Umbraco.Web/Templates/UdiParser.cs
deleted file mode 100644
index 8bb5f8c579..0000000000
--- a/src/Umbraco.Web/Templates/UdiParser.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-using System.Collections.Generic;
-using System.Linq;
-using System.Text.RegularExpressions;
-using Umbraco.Core;
-
-namespace Umbraco.Web.Templates
-{
- ///
- /// Parses out UDIs in strings
- ///
- public sealed class UdiParser
- {
- private static readonly Regex DataUdiAttributeRegex = new Regex(@"data-udi=\\?(?:""|')(?umb://[A-z0-9\-]+/[A-z0-9]+)\\?(?:""|')",
- RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
-
- ///
- /// Parses out UDIs from an html string based on 'data-udi' html attributes
- ///
- ///
- ///
- public IEnumerable ParseUdisFromDataAttributes(string text)
- {
- var matches = DataUdiAttributeRegex.Matches(text);
- if (matches.Count == 0)
- yield break;
-
- foreach (Match match in matches)
- {
- if (match.Groups.Count == 2 && Udi.TryParse(match.Groups[1].Value, out var udi))
- yield return udi;
- }
- }
- }
-}
diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj
index 276cdf9ebc..8fc06c75c2 100755
--- a/src/Umbraco.Web/Umbraco.Web.csproj
+++ b/src/Umbraco.Web/Umbraco.Web.csproj
@@ -247,9 +247,8 @@
-
-
-
+
+
diff --git a/src/Umbraco.Web/UmbracoComponentRenderer.cs b/src/Umbraco.Web/UmbracoComponentRenderer.cs
index c0f83fd1af..83c8a7f0fa 100644
--- a/src/Umbraco.Web/UmbracoComponentRenderer.cs
+++ b/src/Umbraco.Web/UmbracoComponentRenderer.cs
@@ -27,9 +27,9 @@ namespace Umbraco.Web
private readonly IUmbracoContextAccessor _umbracoContextAccessor;
private readonly IMacroRenderer _macroRenderer;
private readonly ITemplateRenderer _templateRenderer;
- private readonly InternalLinkParser _internalLinkParser;
+ private readonly LocalLinkParser _internalLinkParser;
- public UmbracoComponentRenderer(IUmbracoContextAccessor umbracoContextAccessor, IMacroRenderer macroRenderer, ITemplateRenderer templateRenderer, InternalLinkParser internalLinkParser)
+ public UmbracoComponentRenderer(IUmbracoContextAccessor umbracoContextAccessor, IMacroRenderer macroRenderer, ITemplateRenderer templateRenderer, LocalLinkParser internalLinkParser)
{
_umbracoContextAccessor = umbracoContextAccessor;
_macroRenderer = macroRenderer;