using System; using System.Collections.Generic; using System.Threading; using FluentValidation; using MfGames.Gallium; using MfGames.Nitride.Contents; using MfGames.Nitride.Generators; using Zio; namespace MfGames.Nitride.Html; /// /// An operation that identifies Markdown files by their common extensions /// and converts them to text input while also adding the IsMarkdown /// component to identify them. /// [WithProperties] public partial class IdentifyHtml : IOperation { private readonly IValidator validator; public IdentifyHtml(IValidator validator) { this.validator = validator; } public Func IsHtmlTest { get; set; } = null!; /// public IEnumerable Run( IEnumerable input, CancellationToken cancellationToken = default) { this.validator.ValidateAndThrow(this); return input.SelectEntity(this.MarkTextEntities) .SelectEntity(this.MarkBinaryEntities); } private Entity MarkBinaryEntities( Entity entity, UPath path, IBinaryContent binary) { // If we aren't a Markdown file, then there is nothing we can do about that. if (!this.IsHtmlTest(entity, path)) { return entity; } // Convert the file as a binary. if (binary is ITextContentConvertable textConvertable) { entity = entity.SetTextContent(textConvertable.ToTextContent()) .SetIsHtml(); } else { throw new InvalidOperationException( "Cannot convert a binary content to a text without ITextContentConvertable."); } return entity; } private Entity MarkTextEntities( Entity entity, UPath path, ITextContent _) { return this.IsHtmlTest(entity, path) ? entity.SetIsHtml() : entity; } }