diff --git a/src/Textamina.Markdig/Syntax/MarkdownObjectExtensions.cs b/src/Textamina.Markdig/Syntax/MarkdownObjectExtensions.cs new file mode 100644 index 00000000..4f0defe3 --- /dev/null +++ b/src/Textamina.Markdig/Syntax/MarkdownObjectExtensions.cs @@ -0,0 +1,110 @@ +// Copyright (c) Alexandre Mutel. All rights reserved. +// This file is licensed under the BSD-Clause 2 license. +// See the license.txt file in the project root for more information. + +using System.Collections.Generic; +using Textamina.Markdig.Syntax.Inlines; + +namespace Textamina.Markdig.Syntax +{ + /// + /// Extensions for visiting or + /// + public static class MarkdownObjectExtensions + { + /// + /// Iterates over the descendant elements for the specified markdown element, including and . + /// + /// The markdown object. + /// An iteration over the descendant elements + public static IEnumerable Descendants(this MarkdownObject markdownObject) + { + var block = markdownObject as ContainerBlock; + if (block != null) + { + foreach (var subBlock in block) + { + yield return subBlock; + + foreach (var sub in subBlock.Descendants()) + { + yield return sub; + } + } + } + else + { + var inline = markdownObject as ContainerInline; + if (inline != null) + { + var child = inline.FirstChild; + while (child != null) + { + var next = child.NextSibling; + yield return child; + + foreach (var sub in child.Descendants()) + { + yield return sub; + } + + child = next; + } + } + } + } + + /// + /// Iterates over the descendant elements for the specified markdown element and filters by the type {T}, including and . + /// + /// Type to use for filtering the descendants + /// The markdown object. + /// + /// An iteration over the descendant elements + /// + public static IEnumerable Descendants(this MarkdownObject markdownObject) where T : MarkdownObject + { + var block = markdownObject as ContainerBlock; + if (block != null) + { + foreach (var subBlock in block) + { + var subBlockT = subBlock as T; + if (subBlockT != null) + { + yield return subBlockT; + } + + foreach (var sub in subBlock.Descendants()) + { + yield return sub; + } + } + } + else if (typeof(Inline).IsAssignableFrom(typeof(T))) + { + var inline = markdownObject as ContainerInline; + if (inline != null) + { + var child = inline.FirstChild; + while (child != null) + { + var next = child.NextSibling; + var childT = child as T; + if (childT != null) + { + yield return childT; + } + + foreach (var sub in child.Descendants()) + { + yield return sub; + } + + child = next; + } + } + } + } + } +} \ No newline at end of file