private static string AddFragments(TagReader reader, HtmlFragment parentFragment, Stack <string> openTagStack) { while (reader.Read()) { parentFragment.TryToAddText(HtmlText.Create(reader.Document, reader.PreviousTag, reader.CurrentTag)); if (reader.CurrentTag.TagType == TagType.Close && openTagStack.Any(t => t.Equals(reader.CurrentTag.Name, StringComparison.CurrentCultureIgnoreCase))) { return(reader.CurrentTag.Name); } var node = parentFragment.AddNode(reader.CurrentTag); node.Parent = parentFragment; if (reader.CurrentTag.TagType == TagType.Open) { openTagStack.Push(reader.CurrentTag.Name); var lastClosed = AddFragments(reader, node, openTagStack); if (lastClosed != openTagStack.Pop()) { return(lastClosed); } } } return(null); }
public static HtmlDocument Load(string document) { var root = new HtmlDocument(); if (!string.IsNullOrWhiteSpace(document)) { if (IsMarkup(document)) { document = Clean(document); var reader = TagReader.Create(document); AddFragments(reader, root, new Stack <string>()); } else { root.TryToAddText(new HtmlText { Content = document }); } } return(root); }