예제 #1
0
        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());
        }
예제 #2
0
 public static string WrapElements(this string html, Func <Fragment, bool> matchElement, string before, string after, WrapElementsType wrapType)
 => WrapElements(html, matchElement, () => before, () => after, wrapType);