Skip to content

Commit 49756aa

Browse files
committed
feature: extend Umbraco.MarkdownEditor
1 parent 1981d4d commit 49756aa

13 files changed

+417
-64
lines changed

src/jcdcdev.Umbraco.ExtendedMarkdownEditor/Composing/Composer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ public class Composer : IComposer
88
public void Compose(IUmbracoBuilder builder)
99
{
1010
builder.ManifestFilters().Append<ManifestFilter>();
11+
builder.AddMarkDown();
1112
}
1213
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using jcdcdev.Umbraco.ExtendedMarkdownEditor.PropertyEditors;
2+
using jcdcdev.Umbraco.ExtendedMarkdownEditor.Services;
3+
using Microsoft.Extensions.DependencyInjection;
4+
using Umbraco.Cms.Core.DependencyInjection;
5+
using Umbraco.Cms.Core.PropertyEditors;
6+
using Umbraco.Cms.Core.PropertyEditors.ValueConverters;
7+
8+
namespace jcdcdev.Umbraco.ExtendedMarkdownEditor.Composing;
9+
10+
public static class UmbracoBuilderExtensions
11+
{
12+
public static IUmbracoBuilder AddMarkDown(this IUmbracoBuilder builder)
13+
{
14+
builder.Services.AddSingleton<IMarkdownService, MarkdownService>();
15+
builder.PropertyValueConverters().Replace<MarkdownEditorValueConverter, ExtendedMarkdownEditorValueConverter>();
16+
builder.DataEditors().Exclude<MarkdownPropertyEditor>();
17+
return builder;
18+
}
19+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System.Diagnostics.CodeAnalysis;
2+
using Markdig;
3+
using Markdig.Syntax;
4+
5+
namespace jcdcdev.Umbraco.ExtendedMarkdownEditor.Extensions;
6+
7+
internal static class MarkdownExtensions
8+
{
9+
public static bool TryParse(string markdown, [NotNullWhen(true)] out MarkdownDocument? document)
10+
{
11+
try
12+
{
13+
document = Markdown.Parse(markdown);
14+
return true;
15+
}
16+
catch
17+
{
18+
document = null;
19+
return false;
20+
}
21+
}
22+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace jcdcdev.Umbraco.ExtendedMarkdownEditor.Models;
2+
3+
public class MarkdownConvertorOptions
4+
{
5+
public int? HeaderOffset { get; init; }
6+
public bool ExternalLinksOpenInNewTab { get; init; }
7+
public bool TransformLinks => ExternalLinksOpenInNewTab;
8+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System.Diagnostics.CodeAnalysis;
2+
using Markdig.Syntax;
3+
using Umbraco.Cms.Core.Strings;
4+
5+
namespace jcdcdev.Umbraco.ExtendedMarkdownEditor.Models;
6+
7+
public class MarkdownValue
8+
{
9+
private MarkdownValue(string raw, MarkdownDocument? markdown, IHtmlEncodedString html)
10+
{
11+
Raw = raw;
12+
Html = html;
13+
Markdown = markdown;
14+
}
15+
16+
private MarkdownValue()
17+
{
18+
}
19+
20+
[MemberNotNullWhen(true, nameof(Markdown), nameof(Html), nameof(Raw))]
21+
public bool IsValid => Markdown != null && Html != null && !string.IsNullOrWhiteSpace(Raw);
22+
23+
public MarkdownDocument? Markdown { get; }
24+
public string? Raw { get; }
25+
public IHtmlEncodedString? Html { get; }
26+
public static MarkdownValue Empty => new();
27+
public static MarkdownValue Create(string raw, MarkdownDocument markdown, IHtmlEncodedString html) => new(raw, markdown, html);
28+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using Umbraco.Cms.Core.PropertyEditors;
2+
3+
namespace jcdcdev.Umbraco.ExtendedMarkdownEditor.PropertyEditors;
4+
5+
public class ExtendedMarkdownConfiguration : MarkdownConfiguration
6+
{
7+
[ConfigurationField("headerOffset", "Header Offset", "number", Description = "The offset to apply to any header tags")]
8+
public int? HeaderOffset { get; set; }
9+
10+
[ConfigurationField("externalLinksOpenInNewTab", "External Links Open In New Tab", "boolean", Description = "Ensures external links open in a new tab")]
11+
public bool ExternalLinksOpenInNewTab { get; set; }
12+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using Umbraco.Cms.Core.IO;
2+
using Umbraco.Cms.Core.PropertyEditors;
3+
using Umbraco.Cms.Core.Services;
4+
5+
namespace jcdcdev.Umbraco.ExtendedMarkdownEditor.PropertyEditors;
6+
7+
// Or should it be: ExtendedMarkdownConfigurationConfigurationEditor? :D
8+
internal class ExtendedMarkdownConfigurationEditor : ConfigurationEditor<ExtendedMarkdownConfiguration>
9+
{
10+
public ExtendedMarkdownConfigurationEditor(IIOHelper ioHelper, IEditorConfigurationParser editorConfigurationParser) : base(ioHelper, editorConfigurationParser)
11+
{
12+
}
13+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using jcdcdev.Umbraco.ExtendedMarkdownEditor.Models;
2+
using jcdcdev.Umbraco.ExtendedMarkdownEditor.Services;
3+
using Umbraco.Cms.Core.Models.PublishedContent;
4+
using Umbraco.Cms.Core.PropertyEditors;
5+
using Umbraco.Cms.Core.PropertyEditors.ValueConverters;
6+
using Umbraco.Cms.Core.Templates;
7+
8+
namespace jcdcdev.Umbraco.ExtendedMarkdownEditor.PropertyEditors;
9+
10+
public class ExtendedMarkdownEditorValueConverter : MarkdownEditorValueConverter
11+
{
12+
private readonly IMarkdownService _markdownService;
13+
14+
public ExtendedMarkdownEditorValueConverter(
15+
HtmlLocalLinkParser localLinkParser,
16+
HtmlUrlParser urlParser,
17+
IMarkdownService markdownService) : base(localLinkParser, urlParser)
18+
{
19+
_markdownService = markdownService;
20+
}
21+
22+
public override Type GetPropertyValueType(IPublishedPropertyType propertyType) => typeof(MarkdownValue);
23+
24+
public override object ConvertIntermediateToObject(IPublishedElement owner, IPublishedPropertyType propertyType, PropertyCacheLevel referenceCacheLevel, object? inter, bool preview)
25+
{
26+
if (inter is not string s)
27+
{
28+
return MarkdownValue.Empty;
29+
}
30+
31+
var config = propertyType.DataType.ConfigurationAs<ExtendedMarkdownConfiguration>();
32+
var options = new MarkdownConvertorOptions
33+
{
34+
HeaderOffset = config?.HeaderOffset,
35+
ExternalLinksOpenInNewTab = config?.ExternalLinksOpenInNewTab ?? false
36+
};
37+
38+
return _markdownService.CreateFromMarkdownString(s, options);
39+
}
40+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using Umbraco.Cms.Core;
3+
using Umbraco.Cms.Core.IO;
4+
using Umbraco.Cms.Core.PropertyEditors;
5+
using Umbraco.Cms.Core.Services;
6+
using Umbraco.Cms.Web.Common.DependencyInjection;
7+
8+
namespace jcdcdev.Umbraco.ExtendedMarkdownEditor.PropertyEditors;
9+
10+
[DataEditor(
11+
Constants.PropertyEditors.Aliases.MarkdownEditor,
12+
"Markdown editor",
13+
"markdowneditor",
14+
ValueType = ValueTypes.Text,
15+
Group = Constants.PropertyEditors.Groups.RichContent,
16+
Icon = "icon-code",
17+
ValueEditorIsReusable = true)]
18+
public class ExtendedMarkdownPropertyEditor : MarkdownPropertyEditor
19+
{
20+
private readonly IEditorConfigurationParser _editorConfigurationParser;
21+
22+
private readonly IIOHelper _ioHelper;
23+
24+
[Obsolete("Please use constructor that takes an IEditorConfigurationParser instead")]
25+
public ExtendedMarkdownPropertyEditor(IDataValueEditorFactory dataValueEditorFactory, IIOHelper ioHelper) : base(dataValueEditorFactory, ioHelper)
26+
{
27+
_ioHelper = ioHelper;
28+
_editorConfigurationParser = StaticServiceProvider.Instance.GetRequiredService<IEditorConfigurationParser>();
29+
}
30+
31+
public ExtendedMarkdownPropertyEditor(IDataValueEditorFactory dataValueEditorFactory, IIOHelper ioHelper, IEditorConfigurationParser editorConfigurationParser) : base(dataValueEditorFactory,
32+
ioHelper,
33+
editorConfigurationParser)
34+
{
35+
_ioHelper = ioHelper;
36+
_editorConfigurationParser = editorConfigurationParser;
37+
}
38+
39+
protected override IConfigurationEditor CreateConfigurationEditor()
40+
{
41+
var config = new ExtendedMarkdownConfigurationEditor(_ioHelper, _editorConfigurationParser);
42+
return config;
43+
}
44+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using jcdcdev.Umbraco.ExtendedMarkdownEditor.Models;
2+
3+
namespace jcdcdev.Umbraco.ExtendedMarkdownEditor.Services;
4+
5+
public interface IMarkdownService
6+
{
7+
MarkdownValue CreateFromMarkdownString(string markdown, MarkdownConvertorOptions? config = null);
8+
}

0 commit comments

Comments
 (0)