Пример #1
0
        public override Task GetContentItemAspectAsync(ContentItemAspectContext context, MarkdownBodyPart part)
        {
            return(context.ForAsync <BodyAspect>(async bodyAspect =>
            {
                if (_bodyAspect != null)
                {
                    bodyAspect.Body = _bodyAspect;
                    return;
                }

                try
                {
                    var model = new MarkdownBodyPartViewModel()
                    {
                        Markdown = part.Markdown,
                        MarkdownBodyPart = part,
                        ContentItem = part.ContentItem
                    };

                    var templateContext = new TemplateContext();
                    templateContext.SetValue("ContentItem", part.ContentItem);
                    templateContext.MemberAccessStrategy.Register <MarkdownBodyPartViewModel>();
                    templateContext.SetValue("Model", model);

                    var markdown = await _liquidTemplateManager.RenderAsync(part.Markdown, _htmlEncoder, templateContext);
                    var result = Markdig.Markdown.ToHtml(markdown ?? "");

                    bodyAspect.Body = _bodyAspect = new HtmlString(result);
                }
                catch
                {
                    bodyAspect.Body = HtmlString.Empty;
                }
            }));
        }
        private async ValueTask BuildViewModel(MarkdownBodyPartViewModel model, MarkdownBodyPart markdownBodyPart, BuildPartDisplayContext context)
        {
            model.Markdown         = markdownBodyPart.Markdown;
            model.MarkdownBodyPart = markdownBodyPart;
            model.ContentItem      = markdownBodyPart.ContentItem;

            // The default Markdown option is to entity escape html
            // so filters must be run after the markdown has been processed.
            model.Html = _markdownService.ToHtml(model.Markdown ?? "");

            var settings = context.TypePartDefinition.GetSettings <MarkdownBodyPartSettings>();

            // The liquid rendering is for backwards compatibility and can be removed in a future version.
            if (!settings.SanitizeHtml)
            {
                model.Html = await _liquidTemplateManager.RenderStringAsync(model.Html, _htmlEncoder, model,
                                                                            new Dictionary <string, FluidValue>() { ["ContentItem"] = new ObjectValue(model.ContentItem) });
            }

            model.Html = await _shortcodeService.ProcessAsync(model.Html,
                                                              new Context
            {
                ["ContentItem"]        = markdownBodyPart.ContentItem,
                ["TypePartDefinition"] = context.TypePartDefinition
            });

            if (settings.SanitizeHtml)
            {
                model.Html = _htmlSanitizerService.Sanitize(model.Html ?? "");
            }
        }
Пример #3
0
        public override Task GetContentItemAspectAsync(ContentItemAspectContext context, MarkdownBodyPart part)
        {
            return(context.ForAsync <BodyAspect>(async bodyAspect =>
            {
                if (bodyAspect != null && part.ContentItem.Id == _contentItemId)
                {
                    bodyAspect.Body = _bodyAspect;

                    return;
                }

                try
                {
                    var model = new MarkdownBodyPartViewModel()
                    {
                        Markdown = part.Markdown,
                        MarkdownBodyPart = part,
                        ContentItem = part.ContentItem
                    };

                    var markdown = await _liquidTemplateManager.RenderAsync(part.Markdown, _htmlEncoder, model,
                                                                            scope => scope.SetValue("ContentItem", model.ContentItem));

                    var result = Markdig.Markdown.ToHtml(markdown ?? "");

                    bodyAspect.Body = _bodyAspect = new HtmlString(result);
                    _contentItemId = part.ContentItem.Id;
                }
                catch
                {
                    bodyAspect.Body = HtmlString.Empty;
                    _contentItemId = default;
                }
            }));
        }
Пример #4
0
        public override Task GetContentItemAspectAsync(ContentItemAspectContext context, MarkdownBodyPart part)
        {
            return(context.ForAsync <BodyAspect>(async bodyAspect =>
            {
                if (bodyAspect != null && part.ContentItem.Id == _contentItemId)
                {
                    bodyAspect.Body = _bodyAspect;

                    return;
                }

                try
                {
                    var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(part.ContentItem.ContentType);
                    var contentTypePartDefinition = contentTypeDefinition.Parts.FirstOrDefault(x => String.Equals(x.PartDefinition.Name, "MarkdownBodyPart"));
                    var settings = contentTypePartDefinition.GetSettings <MarkdownBodyPartSettings>();

                    // The default Markdown option is to entity escape html
                    // so filters must be run after the markdown has been processed.
                    var html = _markdownService.ToHtml(part.Markdown);

                    // The liquid rendering is for backwards compatability and can be removed in a future version.
                    if (!settings.SanitizeHtml)
                    {
                        var model = new MarkdownBodyPartViewModel()
                        {
                            Markdown = part.Markdown,
                            Html = html,
                            MarkdownBodyPart = part,
                            ContentItem = part.ContentItem
                        };

                        html = await _liquidTemplateManager.RenderAsync(html, _htmlEncoder, model,
                                                                        scope => scope.SetValue("ContentItem", model.ContentItem));
                    }

                    html = await _shortcodeService.ProcessAsync(html,
                                                                new Context
                    {
                        ["ContentItem"] = part.ContentItem,
                        ["TypePartDefinition"] = contentTypePartDefinition
                    });

                    if (settings.SanitizeHtml)
                    {
                        html = _htmlSanitizerService.Sanitize(html);
                    }

                    bodyAspect.Body = _bodyAspect = new HtmlString(html);
                    _contentItemId = part.ContentItem.Id;
                }
                catch
                {
                    bodyAspect.Body = HtmlString.Empty;
                    _contentItemId = default;
                }
            }));
        }
        public override async Task <IDisplayResult> UpdateAsync(MarkdownBodyPart model, IUpdateModel updater)
        {
            var viewModel = new MarkdownBodyPartViewModel();

            await updater.TryUpdateModelAsync(viewModel, Prefix, t => t.Source);

            model.Markdown = viewModel.Source;

            return(Edit(model));
        }
        private async ValueTask BuildViewModel(MarkdownBodyPartViewModel model, MarkdownBodyPart MarkdownBodyPart)
        {
            model.Markdown         = MarkdownBodyPart.Markdown;
            model.MarkdownBodyPart = MarkdownBodyPart;
            model.ContentItem      = MarkdownBodyPart.ContentItem;

            model.Markdown = await _liquidTemplateManager.RenderAsync(MarkdownBodyPart.Markdown, _htmlEncoder, model,
                                                                      scope => scope.SetValue("ContentItem", model.ContentItem));

            model.Html = Markdig.Markdown.ToHtml(model.Markdown ?? "");
        }
        private static async Task <object> ToHtml(ResolveFieldContext <MarkdownBodyPart> ctx)
        {
            if (string.IsNullOrEmpty(ctx.Source.Markdown))
            {
                return(ctx.Source.Markdown);
            }

            var serviceProvider          = ctx.ResolveServiceProvider();
            var markdownService          = serviceProvider.GetRequiredService <IMarkdownService>();
            var shortcodeService         = serviceProvider.GetRequiredService <IShortcodeService>();
            var contentDefinitionManager = serviceProvider.GetRequiredService <IContentDefinitionManager>();

            var contentTypeDefinition     = contentDefinitionManager.GetTypeDefinition(ctx.Source.ContentItem.ContentType);
            var contentTypePartDefinition = contentTypeDefinition.Parts.FirstOrDefault(x => string.Equals(x.PartDefinition.Name, "MarkdownBodyPart"));
            var settings = contentTypePartDefinition.GetSettings <MarkdownBodyPartSettings>();

            // The default Markdown option is to entity escape html
            // so filters must be run after the markdown has been processed.
            var html = markdownService.ToHtml(ctx.Source.Markdown);

            // The liquid rendering is for backwards compatability and can be removed in a future version.
            if (!settings.SanitizeHtml)
            {
                var liquidTemplateManager = serviceProvider.GetService <ILiquidTemplateManager>();
                var htmlEncoder           = serviceProvider.GetService <HtmlEncoder>();
                var model = new MarkdownBodyPartViewModel()
                {
                    Markdown         = ctx.Source.Markdown,
                    Html             = html,
                    MarkdownBodyPart = ctx.Source,
                    ContentItem      = ctx.Source.ContentItem
                };

                html = await liquidTemplateManager.RenderAsync(html, htmlEncoder, model,
                                                               scope => scope.SetValue("ContentItem", model.ContentItem));
            }

            html = await shortcodeService.ProcessAsync(html,
                                                       new Context
            {
                ["ContentItem"]         = ctx.Source.ContentItem,
                ["PartFieldDefinition"] = contentTypePartDefinition
            });

            if (settings.SanitizeHtml)
            {
                var htmlSanitizerService = serviceProvider.GetRequiredService <IHtmlSanitizerService>();
                html = htmlSanitizerService.Sanitize(html);
            }

            return(html);
        }
        private async ValueTask BuildViewModel(MarkdownBodyPartViewModel model, MarkdownBodyPart MarkdownBodyPart)
        {
            var templateContext = new TemplateContext();

            templateContext.SetValue("ContentItem", MarkdownBodyPart.ContentItem);
            templateContext.MemberAccessStrategy.Register <MarkdownBodyPartViewModel>();

            model.Markdown         = MarkdownBodyPart.Markdown;
            model.MarkdownBodyPart = MarkdownBodyPart;
            model.ContentItem      = MarkdownBodyPart.ContentItem;
            templateContext.SetValue("Model", model);

            model.Markdown = await _liquidTemplatemanager.RenderAsync(MarkdownBodyPart.Markdown, _htmlEncoder, templateContext);

            model.Html = Markdig.Markdown.ToHtml(model.Markdown ?? "");
        }
        public override async Task <IDisplayResult> UpdateAsync(MarkdownBodyPart model, IUpdateModel updater, UpdatePartEditorContext context)
        {
            var viewModel = new MarkdownBodyPartViewModel();

            if (await context.Updater.TryUpdateModelAsync(viewModel, Prefix, vm => vm.Markdown))
            {
                if (!string.IsNullOrEmpty(viewModel.Markdown) && !_liquidTemplateManager.Validate(viewModel.Markdown, out var errors))
                {
                    var partName = context.TypePartDefinition.DisplayName();
                    updater.ModelState.AddModelError(Prefix, nameof(viewModel.Markdown), S["{0} doesn't contain a valid Liquid expression. Details: {1}", partName, string.Join(" ", errors)]);
                }
                else
                {
                    model.Markdown = viewModel.Markdown;
                }
            }

            return(Edit(model, context));
        }
        private async Task BuildViewModel(MarkdownBodyPartViewModel model, MarkdownBodyPart MarkdownBodyPart, ContentTypePartDefinition definition)
        {
            var contentTypeDefinition     = _contentDefinitionManager.GetTypeDefinition(MarkdownBodyPart.ContentItem.ContentType);
            var contentTypePartDefinition = contentTypeDefinition.Parts.FirstOrDefault(p => p.PartDefinition.Name == nameof(MarkdownBodyPart));
            var settings = contentTypePartDefinition.GetSettings <MarkdownBodyPartSettings>();

            var templateContext = new TemplateContext();

            templateContext.SetValue("ContentItem", MarkdownBodyPart.ContentItem);
            templateContext.MemberAccessStrategy.Register <MarkdownBodyPartViewModel>();

            var markdown = await _liquidTemplatemanager.RenderAsync(MarkdownBodyPart.Markdown, System.Text.Encodings.Web.HtmlEncoder.Default, templateContext);

            model.Html = Markdig.Markdown.ToHtml(markdown ?? "");

            model.ContentItem        = MarkdownBodyPart.ContentItem;
            model.Source             = MarkdownBodyPart.Markdown;
            model.MarkdownBodyPart   = MarkdownBodyPart;
            model.TypePartDefinition = definition;
        }
        private async Task BuildViewModel(MarkdownBodyPartViewModel model, MarkdownBodyPart MarkdownBodyPart)
        {
            var contentTypeDefinition     = _contentDefinitionManager.GetTypeDefinition(MarkdownBodyPart.ContentItem.ContentType);
            var contentTypePartDefinition = contentTypeDefinition.Parts.FirstOrDefault(p => p.PartDefinition.Name == nameof(MarkdownBodyPart));
            var settings = contentTypePartDefinition.GetSettings <MarkdownBodyPartSettings>();

            var templateContext = new TemplateContext();

            templateContext.SetValue("ContentItem", MarkdownBodyPart.ContentItem);
            templateContext.MemberAccessStrategy.Register <MarkdownBodyPartViewModel>();

            using (var writer = new StringWriter())
            {
                await _liquidTemplatemanager.RenderAsync(MarkdownBodyPart.Markdown, writer, NullEncoder.Default, templateContext);

                model.Source = writer.ToString();
                model.Html   = Markdig.Markdown.ToHtml(model.Source ?? "");
            }

            model.ContentItem      = MarkdownBodyPart.ContentItem;
            model.MarkdownBodyPart = MarkdownBodyPart;
            model.TypePartSettings = settings;
        }
Пример #12
0
        private static async Task <object> ToHtml(ResolveFieldContext <MarkdownBodyPart> ctx)
        {
            if (string.IsNullOrEmpty(ctx.Source.Markdown))
            {
                return(ctx.Source.Markdown);
            }

            var serviceProvider       = ctx.ResolveServiceProvider();
            var liquidTemplateManager = serviceProvider.GetService <ILiquidTemplateManager>();
            var htmlEncoder           = serviceProvider.GetService <HtmlEncoder>();

            var model = new MarkdownBodyPartViewModel()
            {
                Markdown         = ctx.Source.Markdown,
                MarkdownBodyPart = ctx.Source,
                ContentItem      = ctx.Source.ContentItem
            };

            var markdown = await liquidTemplateManager.RenderAsync(ctx.Source.Markdown, htmlEncoder, model,
                                                                   scope => scope.SetValue("ContentItem", model.ContentItem));

            return(Markdig.Markdown.ToHtml(markdown));
        }
Пример #13
0
        private async ValueTask BuildViewModel(MarkdownBodyPartViewModel model, MarkdownBodyPart markdownBodyPart, MarkdownBodyPartSettings settings)
        {
            model.Markdown         = markdownBodyPart.Markdown;
            model.MarkdownBodyPart = markdownBodyPart;
            model.ContentItem      = markdownBodyPart.ContentItem;

            // The default Markdown option is to entity escape html
            // so filters must be run after the markdown has been processed.
            model.Html = _markdownService.ToHtml(model.Markdown ?? "");

            // The liquid rendering is for backwards compatability and can be removed in a future version.
            if (!settings.SanitizeHtml)
            {
                model.Html = await _liquidTemplateManager.RenderAsync(model.Html, _htmlEncoder, model,
                                                                      scope => scope.SetValue("ContentItem", model.ContentItem));
            }

            model.Html = await _shortCodeService.ProcessAsync(model.Html ?? "");

            if (settings.SanitizeHtml)
            {
                model.Html = _htmlSanitizerService.Sanitize(model.Html ?? "");
            }
        }