private async Task <string> FigureAsync(HtmlNode node) { var img = node.Child("img"); if (Image.IsDataUrl(img.Attr("src"))) { throw new InvalidOperationException("<img> src is not rendered yet."); } var src = img.Attr("src"); img.Attributes.RemoveAll(); img.SetAttributeValue("class", "lazyload lazyloading"); img.SetAttributeValue("src", await _imageProcessor.Minimize(src)); img.SetAttributeValue("data-src", src); var caption = node.Child("figcaption"); if (string.IsNullOrWhiteSpace(caption?.InnerHtml)) { return(Emmet.El("figure", img.OuterHtml)); } if (caption.Attributes.Contains("contenteditable")) { caption.Attributes["contenteditable"].Remove(); } img.SetAttributeValue("alt", caption.InnerText); return(Emmet.El("figure", string.Join("", img.OuterHtml, caption.OuterHtml))); }
private async Task <string> Code(HtmlNode node) { var plain = node.InnerHtml.Trim(); var highlightedLines = GetHighlightedLines(GetCode(plain)); var formattedCode = await _codeFormatter.FormatAsync( GetLanguage(plain), GetCode(plain).ReplaceWithPattern(@"\s*#hl", string.Empty)); var lineNumbers = string.Empty; var lines = formattedCode.SplitWithPattern(@"\r?\n"); for (var i = 0; i < lines.Count(); i++) { var no = i + 1; if (highlightedLines.Contains(i)) { lines[i] = Emmet.El("span.highlight", lines[i]); Increment(ref lineNumbers, Emmet.El("span.highlight", no)); } else { Increment(ref lineNumbers, no); } } formattedCode = lines.JoinLines(); if (GetDefinitionLine(plain).Contains("no-line-number")) { return(Emmet.El("div.code>pre", formattedCode)); } var table = $"<table><tr><td>{lineNumbers.Trim()}</td><td>{formattedCode}</td></tr></table>"; return(Emmet.El("div.code>pre", table)); }
public static string El(this HtmlNode node, string selector) => Emmet.El(selector, node.InnerHtml.Trim());
public static string ElChildren(this HtmlNode node) => Emmet.El(node.OriginalName, string.Join("", node.ChildNodes.Select(El)));
public static string El(this HtmlNode node) => string.IsNullOrWhiteSpace(node.InnerHtml) ? string.Empty : Emmet.El(node.OriginalName, node.InnerHtml.Trim());