public static string WrapElements(this string html, Func <Fragment, bool> matchElement, Func <string> before, Func <string> after, WrapElementsType wrapType) { StringBuilder sb = new StringBuilder(html.Length); void AppendElement(WithinElementDomElementEvent ev) { if (ev.ElementEvent.Fragment != null) { sb.Append(html, ev.ElementEvent.Fragment.Trivia.StartPosition, ev.ElementEvent.Fragment.Trivia.Length); } } var events = HtmlLexer.Read(html).WithInElement(matchElement, false); events.ProcessElements( outside: AppendElement, onEnter: (ev) => { switch (wrapType) { case WrapElementsType.ReplaceMatchedElements: sb.Append(before?.Invoke()); break; case WrapElementsType.AddOuterWrapper: sb.Append(before?.Invoke()); AppendElement(ev); break; case WrapElementsType.AddInnerWrapper: AppendElement(ev); sb.Append(before?.Invoke()); break; } }, inside: AppendElement, onExit: (ev) => { switch (wrapType) { case WrapElementsType.ReplaceMatchedElements: sb.Append(after?.Invoke()); break; case WrapElementsType.AddOuterWrapper: AppendElement(ev); sb.Append(after?.Invoke()); break; case WrapElementsType.AddInnerWrapper: sb.Append(after?.Invoke()); AppendElement(ev); break; } }); return(sb.ToString()); }
public static string WrapElements(this string html, Func <Fragment, bool> matchElement, string before, string after, WrapElementsType wrapType) => WrapElements(html, matchElement, () => before, () => after, wrapType);