using Microsoft.AspNetCore.Html; using AsciiDocNet; namespace Yavsc.Helpers { public static class AsciiDocHelpers { static void ToHtml(this IElement elt, IHtmlContentBuilder contentbuilder) { switch (elt.GetType().FullName) { case "AsciiDocNet.Paragraph": Paragraph p = (Paragraph)elt; contentbuilder.AppendHtmlLine("
"); foreach (var pitem in p) { pitem.ToHtml(contentbuilder); } contentbuilder.AppendHtmlLine("
"); break; case "AsciiDocNet.SectionTitle": SectionTitle stitle = (SectionTitle)elt; contentbuilder.AppendHtmlLine($"");
contentbuilder.AppendHtml(source.Text);
contentbuilder.AppendHtmlLine("");
break;
default:
string unsupportedType = elt.GetType().FullName;
throw new InvalidProgramException(unsupportedType);
}
}
public static string GetValidHRef(this Link link)
{
if (link.Href.StartsWith("link:\\"))
return link.Href.Substring(7);
if (link.Href.StartsWith("link:"))
return link.Href.Substring(5);
return link.Href;
}
static void ToHtml(this IInlineElement elt, IHtmlContentBuilder sb)
{
switch (elt.GetType().FullName)
{
case "AsciiDocNet.Monospace":
sb.AppendHtml("");
Monospace mono = (Monospace)elt;
AllItemsToHtml(sb, mono);
break;
case "AsciiDocNet.Link":
Link link = (Link)elt;
Uri uri;
if (Uri.TryCreate(link.Href,
UriKind.RelativeOrAbsolute
, out uri))
{
if (string.IsNullOrEmpty(link.Text))
{
link.Text = $"{uri.Host}({uri.LocalPath})";
}
}
sb.AppendFormat("{1} ", link.GetValidHRef(), link.Text);
break;
case "AsciiDocNet.TextLiteral":
RenderLitteral(elt, sb);
break;
case "AsciiDocNet.Emphasis":
sb.AppendHtml("");
AsciiDocNet.Emphasis em = (Emphasis)elt;
sb.AppendHtml(em.Text);
sb.AppendHtml("");
break;
case "AsciiDocNet.Strong":
sb.AppendHtml("");
Strong str = (Strong)elt;
AllItemsToHtml(sb, str);
sb.AppendHtml("");
break;
case "AsciiDocNet.InternalAnchor":
InternalAnchor a = (InternalAnchor)elt;
sb.AppendFormat("{1} ", a.Id, a.XRefLabel);
break;
case "AsciiDocNet.Subscript":
sb.AppendHtml("");
Subscript sub = (Subscript)elt;
RenderLitteral(sub, sb);
sb.AppendHtml("");
break;
case "AsciiDocNet.Superscript":
sb.AppendHtml("");
Superscript sup = (Superscript)elt;
RenderLitteral(sup, sb);
sb.AppendHtml("");
break;
case "AsciiDocNet.Mark":
sb.AppendHtml("");
Mark mark = (Mark)elt;
if (mark.DoubleDelimited)
{
sb.AppendHtml("");
RenderLitteral(mark, sb);
sb.AppendHtml("");
}
else
RenderLitteral(mark, sb);
sb.AppendHtml("");
break;
default:
string unsupportedType = elt.GetType().FullName;
if (elt is InlineContainer inlineContainer)
{
sb.AppendHtml($"");
AllItemsToHtml(sb, inlineContainer);
sb.AppendHtml("");
}
else if (elt is IInlineElement inlineElement)
{
sb.AppendHtml($"");
RenderLitteral(inlineElement, sb);
sb.AppendHtml("");
}
else
{
throw new InvalidProgramException(unsupportedType);
}
break;
}
}
private static void AllItemsToHtml(IHtmlContentBuilder sb, InlineContainer mono)
{
foreach (var item in mono)
{
item.ToHtml(sb);
}
sb.AppendHtml("");
}
private static void RenderLitteral(IInlineElement elt, IHtmlContentBuilder sb)
{
var tl = elt as TextLiteral;
if (tl?.Attributes.Anchor != null)
{
sb.AppendHtmlLine($"{tl.Attributes.Anchor.XRefLabel} ");
}
if (tl != null) sb.AppendHtml(tl.Text);
}
public static IHtmlContent ToHtml(this Document doc, int doclevel = 4)
{
var contentbuilder = new HtmlContentBuilder();
if (doc.Title != null)
{
if (!string.IsNullOrWhiteSpace(doc.Title.Title))
{
contentbuilder.AppendHtmlLine($"