public DependencyObject[] Generate(HtmlNode node, IHtmlTextBlock textBlock) { var ctrl = GenerateSingle(node, textBlock); if (ctrl != null) return new [] { ctrl }; return null; }
public HtmlNode Parse(string html) { if (html == null) html = ""; html = html.Replace("\n", ""); html = html.RemoveHtmlWhitespaces(); html = html.ConvertUtf8Characters(); html = html.ConvertHtmlCharacters(); html = html.Replace("\r", "").Replace("\n", "").Replace("\t", ""); html = html.Replace("<br>", "\n").Replace("<br />", "\n").Replace("<br/>", "\n"); html = html.Replace("<BR>", "\n").Replace("<BR />", "\n").Replace("<BR/>", "\n"); html = html.Trim('\n', '\r', ' '); html = "<p>" + html + "</p>"; var matches = Regex.Matches(html, "<(.*?)>|</(.*?)>|<(.*?)/>|([^<>]*)"); var tokens = matches.OfType<Group>().Select(m => m.Value).ToArray(); var root = new HtmlNode("html", true); var stack = new Stack<HtmlNode>(); stack.Push(root); foreach (var token in tokens) { if (token.StartsWith("</") && token.EndsWith(">")) // end tag { var value = token.Substring(2, token.Length - 3); var node = stack.Peek(); if (node.Value == value) stack.Pop(); // else // throw new Exception("malformed html"); } else if (token.StartsWith("<") && token.EndsWith("/>")) // full tag { var value = token.Substring(1, token.Length - 3); stack.Peek().AddChild(new HtmlNode(value, true)); } else if (token.StartsWith("<") && token.EndsWith(">")) // start tag { var value = token.Substring(1, token.Length - 2); var node = new HtmlNode(value, true); stack.Peek().AddChild(node); stack.Push(node); } else if (!string.IsNullOrEmpty(token)) // text stack.Peek().AddChild(new HtmlNode(token, false)); } return root; }
public abstract DependencyObject GenerateSingle(HtmlNode node, IHtmlTextBlock textBlock);
internal void AddChild(HtmlNode node) { Children.Add(node); }