public static string ToString(this INode node, NodeStringType type = NodeStringType.BBCode) { if (node is IPlainTextNode) return (node as IPlainTextNode).Text; StringBuilder build = new StringBuilder(); if (type == NodeStringType.BBCode) { build.Append('['); build.Append(node.GetName()); if (node is IAttributeNode && !string.IsNullOrEmpty((node as IAttributeNode).Attribute)) { build.Append('='); build.Append((node as IAttributeNode).Attribute); } build.Append(']'); } var extMethod = typeof(INodeExtensions).GetMethod($"To{type}", BindingFlags.Static, Type.DefaultBinder, CallingConventions.Any, new Type[] { node.GetType() }, null); if (extMethod != null) build.Append(extMethod.Invoke(null, new[] { node }) as string); else if (node is ITextNode) build.Append((node as ITextNode).Text); else if (node is IContentNode) { foreach (var child in (node as IContentNode).Content) build.Append(child.ToString(type)); } else return build.ToString(); if (type == NodeStringType.BBCode) { build.Append("[/"); build.Append(node.GetName()); build.Append(']'); } return build.ToString(); }
public static string ToString(this IEnumerable<INode> nodes, NodeStringType type = NodeStringType.BBCode) { return string.Join(" ", nodes.Select(n => n.ToString(type)).ToArray()); }