Ejemplo n.º 1
0
        public WikiRootElement Parse(string text)
        {
            WikiRootElement root = new WikiRootElement ();
            WikiElement cur = root;

            using (StringReader reader = new StringReader (text)) {
                string line;
                while ((line = reader.ReadLine ()) != null) {
                    if (line.Length >= 2 && line[0] == '/' && line[1] == '/')
                        continue;
                    line = line.TrimEnd ();

                    if (line.Length == 0) {
                        cur = root;
                        continue;
                    }

                    WikiElement element = null;
                    int indent = -1;
                    switch (line[0]) {
                        case '*':
                            indent = Math.Min (6, WikiTextUtility.CountSameChars (line, '*'));
                            root.Add (element = new WikiHeadingElement (indent, false));
                            cur = root;
                            break;
                        case '+':
                        case '-':
                            WikiListContainer list_container = cur as WikiListContainer;
                            WikiListType type = line[0] == '-' ? WikiListType.Itemizing : WikiListType.Enumerating;
                            indent = Math.Min (3, WikiTextUtility.CountSameChars (line, line[0]));
                            if (list_container == null) {
                                list_container = new WikiListContainer (type, 1, false);
                                cur = cur.Add (list_container);
                            }
                            for (int i = list_container.Indent + 1; i < indent; i ++) {
                                list_container = new WikiListContainer (type, i, false);
                                cur = cur.Add (list_container);
                            }
                            if (list_container.Indent < indent || (list_container.Indent == indent && list_container.ListType != type)) {
                                list_container = new WikiListContainer (type, indent, false);
                                cur = cur.Add (list_container);
                            }
                            element = new WikiListItemElement (indent, false);
                            cur = list_container.Add (element);
                            break;
                    }
                    if (element != null) {
                        if (indent > 0)
                            line = line.Substring (indent).Trim ();
                        if (line.Length > 0)
                            element.Add (new WikiTextNode (line));
                    } else {
                        cur = cur.Add (new WikiTextNode (line.Trim ()));
                    }
                }
            }

            return root;
        }
Ejemplo n.º 2
0
 public string Render(WikiRootElement root, IWikiParser parser)
 {
     StringBuilder sb = new StringBuilder ();
     Render (root, sb, parser);
     return sb.ToString ();
 }