Пример #1
0
        /// <summary>
        /// Creates a clone of this UnderlineElement and its children
        /// </summary>
        /// <returns>A new UnderlineElement</returns>
        public override Element Clone()
        {
            Element clone = new UnderlineElement();

            foreach (Element child in this.Children)
            {
                clone.Children.Add(child.Clone());
            }
            return(clone);
        }
Пример #2
0
 public override string OnUnderlineClose(UnderlineElement element)
 {
     return("");
 }
Пример #3
0
 public override string OnUnderlineOpen(UnderlineElement element)
 {
     return("<u>");
 }
Пример #4
0
        public Element Parse(string aoml)
        {
            ContainerElement container = new ContainerElement();
            // Parse AOML
            NodeCollection nodes = this.Parser.Parse(aoml);

            this.Parser.Sanitize(nodes);
            this.Parser.Balance(nodes);
            // Transform AOML into a DOM tree
            Stack <Element> elements = new Stack <Element>();

            elements.Push(container);
            foreach (Node node in nodes)
            {
                Element element = null;
                switch (node.Type)
                {
                case NodeType.Content:
                    // Content doesn't introduce a new level
                    // We'll simply add it as child at the current depth
                    ContentNode content = (ContentNode)node;
                    element = new TextElement(Web.UnescapeHtml(content.Value));
                    elements.Peek().Children.Add(element);
                    break;

                case NodeType.Open:
                    OpenNode open = (OpenNode)node;
                    switch (open.Name)
                    {
                    case "br":
                        // Singular linebreak element
                        element = new BreakElement();
                        elements.Peek().Children.Add(element);
                        break;

                    case "img":
                        // Singular image element
                        element = this.CreateImageElement(open);
                        if (element != null)
                        {
                            elements.Peek().Children.Add(element);
                        }
                        break;

                    case "font":
                        element = this.CreateFontElement(open);
                        elements.Peek().Children.Add(element);
                        if (!open.Closed)
                        {
                            elements.Push(element);
                        }
                        break;

                    case "a":
                        element = this.CreateLinkElement(open);
                        elements.Peek().Children.Add(element);
                        if (!open.Closed)
                        {
                            elements.Push(element);
                        }
                        break;

                    case "u":
                        element = new UnderlineElement();
                        elements.Peek().Children.Add(element);
                        if (!open.Closed)
                        {
                            elements.Push(element);
                        }
                        break;

                    case "i":
                        element = new ItalicElement();
                        elements.Peek().Children.Add(element);
                        if (!open.Closed)
                        {
                            elements.Push(element);
                        }
                        break;

                    case "center":
                    case "left":
                    case "right":
                    case "div":
                        Alignment alignment = Alignment.Inherit;
                        if (open.Name == "center" || open.GetAttribute("align") == "center")
                        {
                            alignment = Alignment.Center;
                        }
                        else if (open.Name == "left" || open.GetAttribute("align") == "left")
                        {
                            alignment = Alignment.Left;
                        }
                        else if (open.Name == "right" || open.GetAttribute("align") == "right")
                        {
                            alignment = Alignment.Right;
                        }
                        element = new AlignElement(alignment);
                        elements.Peek().Children.Add(element);
                        if (!open.Closed)
                        {
                            elements.Push(element);
                        }
                        break;

                    default:
                        throw new ArgumentException("Unexpected tag: " + open.Name);
                    }
                    break;

                case NodeType.Close:
                    // Closing a node means consuming an element from the stack
                    // But first check whether the node matches the element on the stack
                    CloseNode close = (CloseNode)node;
                    switch (close.Name)
                    {
                    case "br":
                        throw new ArgumentException("Unexpected 'br' closing tag");

                    case "img":
                        throw new ArgumentException("Unexpected 'img' closing tag");

                    case "font":
                        if (elements.Peek().Type == ElementType.Color)
                        {
                            break;
                        }
                        if (elements.Peek().Type == ElementType.Container)
                        {
                            break;
                        }
                        throw new ArgumentException("Unexpected 'font' closing tag");

                    case "a":
                        if (elements.Peek().Type == ElementType.Link)
                        {
                            break;
                        }
                        if (elements.Peek().Type == ElementType.Container)
                        {
                            break;
                        }
                        throw new ArgumentException("Unexpected 'a' closing tag");

                    case "u":
                        if (elements.Peek().Type == ElementType.Underline)
                        {
                            break;
                        }
                        throw new ArgumentException("Unexpected 'u' closing tag");

                    case "i":
                        if (elements.Peek().Type == ElementType.Italic)
                        {
                            break;
                        }
                        throw new ArgumentException("Unexpected 'i' closing tag");

                    case "div":
                    case "center":
                    case "left":
                    case "right":
                        if (elements.Peek().Type == ElementType.Align)
                        {
                            break;
                        }
                        throw new ArgumentException("Unexpected '" + close.Name + "' closing tag");

                    default:
                        throw new ArgumentException("Unexpected tag: " + close.Name);
                    }
                    if (elements.Count <= 1)
                    {
                        throw new ArgumentException("Unexpected closing tag");
                    }
                    // Go 1 step back down in the tree
                    elements.Pop();
                    break;

                default:
                    throw new InvalidOperationException("Unexpected node type");
                }
            }
            // Let's report our progress
            if (container.Children.Count == 0)
            {
                return(null);
            }
            if (container.Children.Count == 1)
            {
                return(container.Children.ToArray()[0]);
            }
            return(container);
        }
Пример #5
0
        public void Format(ref StringBuilder result, Element element)
        {
            if (result == null || element == null)
            {
                throw new ArgumentNullException();
            }
            // Open element
            result.Append(this.OnBeforeElement(element));
            switch (element.Type)
            {
            case ElementType.Align:
                AlignElement align = (AlignElement)element;
                result.Append(this.OnAlignOpen(align));
                break;

            case ElementType.Break:
                BreakElement linebreak = (BreakElement)element;
                result.Append(this.OnBreak(linebreak));
                break;

            case ElementType.Color:
                ColorElement color = (ColorElement)element;
                result.Append(this.OnColorOpen(color));
                break;

            case ElementType.Container:
                ContainerElement container = (ContainerElement)element;
                result.Append(this.OnContainerOpen(container));
                break;

            case ElementType.Image:
                ImageElement image = (ImageElement)element;
                result.Append(this.OnImage(image));
                break;

            case ElementType.Link:
                LinkElement link = (LinkElement)element;
                result.Append(this.OnLinkOpen(link));
                break;

            case ElementType.Text:
                TextElement text = (TextElement)element;
                result.Append(this.OnText(text));
                break;

            case ElementType.Underline:
                UnderlineElement underline = (UnderlineElement)element;
                result.Append(this.OnUnderlineOpen(underline));
                break;

            case ElementType.Italic:
                ItalicElement italic = (ItalicElement)element;
                result.Append(this.OnItalicOpen(italic));
                break;
            }
            // Process children
            if (element.Children != null)
            {
                foreach (Element child in element.Children)
                {
                    this.Format(ref result, child);
                }
            }
            // Close element
            switch (element.Type)
            {
            case ElementType.Align:
                AlignElement align = (AlignElement)element;
                result.Append(this.OnAlignClose(align));
                break;

            case ElementType.Color:
                ColorElement color = (ColorElement)element;
                result.Append(this.OnColorClose(color));
                break;

            case ElementType.Container:
                ContainerElement container = (ContainerElement)element;
                result.Append(this.OnContainerClose(container));
                break;

            case ElementType.Link:
                LinkElement link = (LinkElement)element;
                result.Append(this.OnLinkClose(link));
                break;

            case ElementType.Underline:
                UnderlineElement underline = (UnderlineElement)element;
                result.Append(this.OnUnderlineClose(underline));
                break;

            case ElementType.Italic:
                ItalicElement italic = (ItalicElement)element;
                result.Append(this.OnItalicClose(italic));
                break;
            }
            result.Append(this.OnAfterElement(element));
        }
Пример #6
0
 public abstract string OnUnderlineClose(UnderlineElement element);
Пример #7
0
 public abstract string OnUnderlineOpen(UnderlineElement element);