Renames some stuff, updates RTE editor to return media/content refs and adds tests for locallink parsing

This commit is contained in:
Shannon
2019-10-22 15:48:47 +11:00
parent 6bb8a15a87
commit 1adf5a30f3
19 changed files with 156 additions and 117 deletions

View File

@@ -43,7 +43,7 @@ namespace Umbraco.Tests.PublishedContent
var logger = Mock.Of<ILogger>();
var dataTypeService = new TestObjects.TestDataTypeService(
new DataType(new RichTextPropertyEditor(logger, umbracoCtxAccessor, new MediaParser(umbracoCtxAccessor, logger, Mock.Of<IMediaService>(), Mock.Of<IContentTypeBaseServiceProvider>()))) { Id = 1 });
new DataType(new RichTextPropertyEditor(logger, umbracoCtxAccessor, new ImageSourceParser(umbracoCtxAccessor, logger, Mock.Of<IMediaService>(), Mock.Of<IContentTypeBaseServiceProvider>()))) { Id = 1 });
var publishedContentTypeFactory = new PublishedContentTypeFactory(Mock.Of<IPublishedModelFactory>(), converters, dataTypeService);

View File

@@ -46,7 +46,7 @@ namespace Umbraco.Tests.PublishedContent
var mediaService = Mock.Of<IMediaService>();
var contentTypeBaseServiceProvider = Mock.Of<IContentTypeBaseServiceProvider>();
var umbracoContextAccessor = Mock.Of<IUmbracoContextAccessor>();
var mediaParser = new MediaParser(umbracoContextAccessor, logger, mediaService, contentTypeBaseServiceProvider);
var mediaParser = new ImageSourceParser(umbracoContextAccessor, logger, mediaService, contentTypeBaseServiceProvider);
var dataTypeService = new TestObjects.TestDataTypeService(
new DataType(new VoidEditor(logger)) { Id = 1 },

View File

@@ -12,19 +12,40 @@ using System.Web;
using System;
using System.Linq;
using Umbraco.Core.Models;
using Umbraco.Core;
namespace Umbraco.Tests.Templates
{
[TestFixture]
public class MediaParserTests
public class ImageSourceParserTests
{
[Test]
public void Returns_Udis_From_Data_Udi_Html_Attributes()
{
var input = @"<p>
<div>
<img src='/media/12312.jpg' data-udi='umb://media/D4B18427A1544721B09AC7692F35C264' />
</div>
</p><p><img src='/media/234234.jpg' data-udi=""umb://media-type/B726D735E4C446D58F703F3FBCFC97A5"" /></p>";
var logger = Mock.Of<ILogger>();
var umbracoContextAccessor = new TestUmbracoContextAccessor();
var mediaParser = new ImageSourceParser(umbracoContextAccessor, logger, Mock.Of<IMediaService>(), Mock.Of<IContentTypeBaseServiceProvider>());
var result = mediaParser.FindUdisFromDataAttributes(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]);
}
[Test]
public void Remove_Image_Sources()
{
var logger = Mock.Of<ILogger>();
var umbracoContextAccessor = new TestUmbracoContextAccessor();
var mediaParser = new MediaParser(umbracoContextAccessor, logger, Mock.Of<IMediaService>(), Mock.Of<IContentTypeBaseServiceProvider>());
var mediaParser = new ImageSourceParser(umbracoContextAccessor, logger, Mock.Of<IMediaService>(), Mock.Of<IContentTypeBaseServiceProvider>());
var result = mediaParser.RemoveImageSources(@"<p>
<div>
@@ -66,7 +87,7 @@ namespace Umbraco.Tests.Templates
var mediaCache = Mock.Get(reference.UmbracoContext.Media);
mediaCache.Setup(x => x.GetById(It.IsAny<Guid>())).Returns(media.Object);
var mediaParser = new MediaParser(umbracoContextAccessor, Mock.Of<ILogger>(), Mock.Of<IMediaService>(), Mock.Of<IContentTypeBaseServiceProvider>());
var mediaParser = new ImageSourceParser(umbracoContextAccessor, Mock.Of<ILogger>(), Mock.Of<IMediaService>(), Mock.Of<IContentTypeBaseServiceProvider>());
var result = mediaParser.EnsureImageSources(@"<p>
<div>

View File

@@ -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 = @"<p>
<div>
<img src='/media/12312.jpg' data-udi='umb://media/D4B18427A1544721B09AC7692F35C264' />
<a href=""{locallink:umb://document/C093961595094900AAF9170DDE6AD442}"">hello</a>
</div>
</p><p><img src='/media/234234.jpg' data-udi=""umb://media-type/B726D735E4C446D58F703F3FBCFC97A5"" />
<a href=""{locallink:umb://document-type/2D692FCB070B4CDA92FB6883FDBFD6E2}"">hello</a>
</p>";
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]);
}
}
}

View File

@@ -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 = @"<p>
<div>
<img src='/media/12312.jpg' data-udi='umb://media/D4B18427A1544721B09AC7692F35C264' />
</div>
</p><p><img src='/media/234234.jpg' data-udi=""umb://media-type/B726D735E4C446D58F703F3FBCFC97A5"" /></p>";
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]);
}
}
}

View File

@@ -159,7 +159,7 @@
<Compile Include="Services\MemberGroupServiceTests.cs" />
<Compile Include="Services\MediaTypeServiceTests.cs" />
<Compile Include="Services\PropertyValidationServiceTests.cs" />
<Compile Include="Templates\UdiParserTests.cs" />
<Compile Include="Templates\LocalLinkParserTests.cs" />
<Compile Include="TestHelpers\RandomIdRamDirectory.cs" />
<Compile Include="Testing\Objects\TestDataSource.cs" />
<Compile Include="Published\PublishedSnapshotTestObjects.cs" />
@@ -256,7 +256,7 @@
<Compile Include="Web\HealthChecks\HealthCheckResultsTests.cs" />
<Compile Include="Web\HttpCookieExtensionsTests.cs" />
<Compile Include="Web\InternalLinkParserTests.cs" />
<Compile Include="Templates\MediaParserTests.cs" />
<Compile Include="Templates\ImageSourceParserTests.cs" />
<Compile Include="Web\Mvc\HtmlStringUtilitiesTests.cs" />
<Compile Include="Web\ModelStateExtensionsTests.cs" />
<Compile Include="Web\Mvc\RenderIndexActionSelectorAttributeTests.cs" />

View File

@@ -65,7 +65,7 @@ namespace Umbraco.Tests.Web
mediaCache.Setup(x => x.GetById(It.IsAny<int>())).Returns(media.Object);
mediaCache.Setup(x => x.GetById(It.IsAny<Guid>())).Returns(media.Object);
var linkParser = new InternalLinkParser(umbracoContextAccessor);
var linkParser = new LocalLinkParser(umbracoContextAccessor);
var output = linkParser.EnsureInternalLinks(input);

View File

@@ -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;

View File

@@ -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;
/// <summary>
/// The constructor will setup the property editor based on the attribute if one is found
/// </summary>
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
/// <returns></returns>
public IEnumerable<Udi> GetReferences(object value)
{
throw new NotImplementedException();
return _mediaParser.FindUdisFromDataAttributes(value == null ? string.Empty : value is string str ? str : value.ToString()).ToList();
}
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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)

View File

@@ -107,9 +107,9 @@ namespace Umbraco.Web.Runtime
composition.RegisterUnique<IMacroRenderer, MacroRenderer>();
composition.RegisterUnique<IUmbracoComponentRenderer, UmbracoComponentRenderer>();
composition.RegisterUnique<InternalLinkParser>();
composition.RegisterUnique<LocalLinkParser>();
composition.RegisterUnique<UrlParser>();
composition.RegisterUnique<MediaParser>();
composition.RegisterUnique<ImageSourceParser>();
// register the umbraco helper - this is Transient! very important!
// also, if not level.Run, we cannot really use the helper (during upgrade...)

View File

@@ -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=\\?(?:""|')(?<udi>umb://[A-z0-9\-]+/[A-z0-9]+)\\?(?:""|')",
RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
/// <summary>
/// Parses out UDIs from an html string based on 'data-udi' html attributes
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public IEnumerable<Udi> 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;
}
}
/// <summary>
/// Parses the string looking for Umbraco image tags and updates them to their up-to-date image sources.
/// </summary>
@@ -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);
}
}
}

View File

@@ -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
/// <summary>
/// Utility class used to parse internal links
/// </summary>
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<Udi> 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
}
}
/// <summary>
/// Parses the string looking for the {localLink} syntax and updates them to their correct links.
/// </summary>
@@ -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;
}
}
}

View File

@@ -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<InternalLinkParser>().EnsureInternalLinks(text);
=> Current.Factory.GetInstance<LocalLinkParser>().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<MediaParser>().EnsureImageSources(text);
=> Current.Factory.GetInstance<ImageSourceParser>().EnsureImageSources(text);
[Obsolete("Use MediaParser.RemoveImageSources instead")]
internal static string RemoveMediaUrlsFromTextString(string text)
=> Current.Factory.GetInstance<MediaParser>().RemoveImageSources(text);
=> Current.Factory.GetInstance<ImageSourceParser>().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<MediaParser>().FindAndPersistPastedTempImages(html, mediaParentFolder, userId);
=> Current.Factory.GetInstance<ImageSourceParser>().FindAndPersistPastedTempImages(html, mediaParentFolder, userId);
}
}

View File

@@ -1,34 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Umbraco.Core;
namespace Umbraco.Web.Templates
{
/// <summary>
/// Parses out UDIs in strings
/// </summary>
public sealed class UdiParser
{
private static readonly Regex DataUdiAttributeRegex = new Regex(@"data-udi=\\?(?:""|')(?<udi>umb://[A-z0-9\-]+/[A-z0-9]+)\\?(?:""|')",
RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
/// <summary>
/// Parses out UDIs from an html string based on 'data-udi' html attributes
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public IEnumerable<Udi> 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;
}
}
}
}

View File

@@ -247,9 +247,8 @@
<Compile Include="Models\Link.cs" />
<Compile Include="Models\LinkType.cs" />
<Compile Include="Models\TemplateQuery\OperatorFactory.cs" />
<Compile Include="Templates\InternalLinkParser.cs" />
<Compile Include="Templates\MediaParser.cs" />
<Compile Include="Templates\UdiParser.cs" />
<Compile Include="Templates\LocalLinkParser.cs" />
<Compile Include="Templates\ImageSourceParser.cs" />
<Compile Include="Templates\UrlParser.cs" />
<Compile Include="UmbracoContextFactory.cs" />
<Compile Include="UmbracoContextReference.cs" />

View File

@@ -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;