private static WikiTextNode ParseTextGreedy(string page, WikiTextNodeType type, int start, out int idx) { string delimiter; switch (type) { case WikiTextNodeType.Comment: delimiter = "-->"; break; case WikiTextNodeType.Section2: delimiter = "=="; break; case WikiTextNodeType.Section3: delimiter = "==="; break; case WikiTextNodeType.Section4: delimiter = "===="; break; case WikiTextNodeType.Section5: delimiter = "====="; break; default: throw new ArgumentOutOfRangeException("type"); } WikiTextNode node = new WikiTextNode(type); idx = start; int closingidx = page.IndexOf(delimiter, idx); if (closingidx < 0) { node.Text = page.Substring(idx).TrimWhitespace(); idx = page.Length; } else { node.Text = page.Substring(idx, closingidx - idx).TrimWhitespace(); idx = closingidx + delimiter.Length; } return(node); }
private static WikiTableNode ParseTable(string page, int start, out int idx) { var node = new WikiTableNode(); WikiNode newnode; List <WikiNode> currentCell = new List <WikiNode>(); node.Cells.Add(currentCell); idx = start; while (idx < page.Length) { int type, delta; start = idx; idx = page.FirstIndexOf(start, out type, out delta, "<!--", "{{", "{|", "|}", "|-", "!", "|"); if (type != -1) { string text = page.Substring(start, delta).TrimWhitespace(); if (!string.IsNullOrEmpty(text)) { newnode = new WikiTextNode(text); currentCell.Add(newnode); node.Children.Add(newnode); } } switch (type) { case 0: // <!-- newnode = ParseTextGreedy(page, WikiTextNodeType.Comment, idx, out idx); currentCell.Add(newnode); node.Children.Add(newnode); break; case 1: // {{ newnode = ParseTemplate(page, idx, out idx); currentCell.Add(newnode); node.Children.Add(newnode); break; case 2: // {| newnode = ParseTable(page, idx, out idx); currentCell.Add(newnode); node.Children.Add(newnode); break; case 3: // |} return(node); case 4: // |- // don't do anything break; case 5: // ! case 6: // | currentCell = new List <WikiNode>(); node.Cells.Add(currentCell); break; default: // just text left string rest = page.Substring(idx).TrimWhitespace(); if (!string.IsNullOrEmpty(rest)) { newnode = new WikiTextNode(rest); currentCell.Add(newnode); node.Children.Add(newnode); } return(node); } } return(node); }