2021-09-07 05:15:45 +00:00
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
2022-06-05 18:44:51 +00:00
|
|
|
|
|
|
|
using FluentValidation;
|
|
|
|
|
2021-09-07 05:15:45 +00:00
|
|
|
using Gallium;
|
2022-06-05 18:44:51 +00:00
|
|
|
|
2021-09-07 05:15:45 +00:00
|
|
|
using Nitride.Contents;
|
2022-06-05 18:44:51 +00:00
|
|
|
|
2021-09-07 05:15:45 +00:00
|
|
|
using Zio;
|
|
|
|
|
2022-06-05 18:44:51 +00:00
|
|
|
namespace Nitride.Markdown;
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 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.
|
|
|
|
/// </summary>
|
|
|
|
[WithProperties]
|
|
|
|
public partial class IdentifyMarkdown : IOperation
|
2021-09-07 05:15:45 +00:00
|
|
|
{
|
2022-06-05 18:44:51 +00:00
|
|
|
private readonly IValidator<IdentifyMarkdown> validator;
|
|
|
|
|
|
|
|
public IdentifyMarkdown(IValidator<IdentifyMarkdown> validator)
|
|
|
|
{
|
|
|
|
this.validator = validator;
|
|
|
|
this.IsMarkdownTest = DefaultIsMarkdown;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Func<Entity, UPath, bool> IsMarkdownTest { get; set; }
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
public IEnumerable<Entity> Run(IEnumerable<Entity> input)
|
|
|
|
{
|
|
|
|
this.validator.ValidateAndThrow(this);
|
|
|
|
|
|
|
|
return input.ForEachEntity<UPath, ITextContent>(this.MarkTextEntities)
|
|
|
|
.ForEachEntity<UPath, IBinaryContent>(this.MarkBinaryEntities);
|
|
|
|
}
|
|
|
|
|
|
|
|
private static bool DefaultIsMarkdown(Entity entity, UPath path)
|
2021-09-07 05:15:45 +00:00
|
|
|
{
|
2022-06-05 18:44:51 +00:00
|
|
|
return (path.GetExtensionWithDot() ?? string.Empty).ToLowerInvariant() switch
|
2021-09-07 05:15:45 +00:00
|
|
|
{
|
2022-06-05 18:44:51 +00:00
|
|
|
".md" => true,
|
|
|
|
".markdown" => true,
|
|
|
|
_ => false,
|
|
|
|
};
|
|
|
|
}
|
2021-09-07 05:15:45 +00:00
|
|
|
|
2022-06-05 18:44:51 +00:00
|
|
|
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.IsMarkdownTest(entity, path))
|
|
|
|
{
|
|
|
|
return entity;
|
|
|
|
}
|
2021-09-07 05:15:45 +00:00
|
|
|
|
2022-06-05 18:44:51 +00:00
|
|
|
// Convert the file as a binary.
|
|
|
|
if (binary is ITextContentConvertable textConvertable)
|
2021-09-07 05:15:45 +00:00
|
|
|
{
|
2022-06-05 18:44:51 +00:00
|
|
|
entity = entity.SetTextContent(textConvertable.ToTextContent()).Set(IsMarkdown.Instance);
|
2021-09-07 05:15:45 +00:00
|
|
|
}
|
2022-06-05 18:44:51 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
throw new InvalidOperationException(
|
|
|
|
"Cannot convert a binary content to a " + "text without ITextContentConvertable.");
|
|
|
|
}
|
|
|
|
|
|
|
|
return entity;
|
|
|
|
}
|
2021-09-07 05:15:45 +00:00
|
|
|
|
2022-06-05 18:44:51 +00:00
|
|
|
private Entity MarkTextEntities(Entity entity, UPath path, ITextContent _)
|
|
|
|
{
|
|
|
|
// If we aren't a Markdown file, then there is nothing
|
|
|
|
// we can do about that.
|
|
|
|
if (!this.IsMarkdownTest(entity, path))
|
2021-09-07 05:15:45 +00:00
|
|
|
{
|
2022-06-05 18:44:51 +00:00
|
|
|
return entity;
|
2021-09-07 05:15:45 +00:00
|
|
|
}
|
2022-06-05 18:44:51 +00:00
|
|
|
|
|
|
|
// We are already text, so just mark it as Markdown.
|
|
|
|
entity = entity.Set(IsMarkdown.Instance);
|
|
|
|
|
|
|
|
return entity;
|
2021-09-07 05:15:45 +00:00
|
|
|
}
|
|
|
|
}
|