/// <summary> /// Creates a clone of this UnderlineElement and its children /// </summary> /// <returns>A new UnderlineElement</returns> public override Element Clone() { Element clone = new ItalicElement(); foreach (Element child in this.Children) { clone.Children.Add(child.Clone()); } return(clone); }
public void ItalicElement_New_Instance_Should_Produce_Correct_Tag() { //Arrange const string Tag = "i"; var element = new ItalicElement("Here I am. This is me."); //Act string tag = element.Tag; //Assert Assert.NotNull(element); Assert.Equal(Tag, element.Tag); }
public override string OnItalicClose(ItalicElement element) { return(""); }
public override string OnItalicOpen(ItalicElement element) { return(""); }
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); }
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)); }
public abstract string OnItalicClose(ItalicElement element);
public abstract string OnItalicOpen(ItalicElement element);