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($""); foreach (var titem in stitle) { titem.ToHtml(contentbuilder); } contentbuilder.AppendHtmlLine(""); break; case "AsciiDocNet.UnorderedList": UnorderedList ul = (UnorderedList)elt; contentbuilder.AppendHtmlLine(""); break; case "AsciiDocNet.Source": Source source = (Source)elt; // TODO syntact hilighting and fun js modules 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($"{doc.Title.Title}"); if (!string.IsNullOrWhiteSpace(doc.Title.Subtitle)) { contentbuilder.AppendHtmlLine($"{doc.Title.Title}
"); } } } foreach (var item in doc) { item.ToHtml(contentbuilder); } return contentbuilder; } /* public static IHtmlContent AsciiDocFor(this IHtmlHelper html, Expression> expression) { string ascii = html.ValueFor(expression, "{0}"); if (string.IsNullOrWhiteSpace(ascii)) return new HtmlString(string.Empty); Document document = Document.Parse(ascii); var htmlDoc = document.ToHtml(); var span = new TagBuilder("p") { TagRenderMode = TagRenderMode.SelfClosing }; span.InnerHtml.AppendHtml(htmlDoc); return span.RenderBody(); } public static string AsciiDoc(IHtmlHelper htmlHelper, string text) { return AsciiDoc(htmlHelper, text, null); } private static string AsciiDoc(IHtmlHelper htmlHelper, string text, object htmlAttributes) { // Create tag builder var builder = new TagBuilder("div"); var document = Document.Parse(text); // builder.InnerHtml = . // Add attributes builder.MergeAttribute("class", "ascii"); builder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); // Render tag return builder.ToString(); } */ } }