Example #1
0
        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);
        }
Example #2
0
        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);
        }