public void Visit(ISvgUseElement element)
        {
            SvgUseElement useElement = (SvgUseElement)element;
            SvgDocument   document   = useElement.OwnerDocument;
            XmlElement    refEl      = useElement.ReferencedElement;

            if (refEl == null)
            {
                return;
            }

            bool isImported = false;

            // For the external node, the documents are different, and we may not be
            // able to insert this node, so we first import it...
            if (useElement.OwnerDocument != refEl.OwnerDocument)
            {
                var importedNode = useElement.OwnerDocument.ImportNode(refEl, true) as XmlElement;

                if (importedNode != null)
                {
                    var importedSvgElement = importedNode as SvgElement;
                    if (importedSvgElement != null)
                    {
                        importedSvgElement.Imported       = true;
                        importedSvgElement.ImportNode     = refEl as SvgElement;
                        importedSvgElement.ImportDocument = refEl.OwnerDocument as SvgDocument;
                    }

                    refEl      = importedNode;
                    isImported = true;
                }
            }
            XmlElement refElParent = (XmlElement)refEl.ParentNode;

            useElement.OwnerDocument.Static = true;
            useElement.CopyToReferencedElement(refEl);
            if (!isImported) // if imported, we do not need to remove it...
            {
                refElParent.RemoveChild(refEl);
            }
            useElement.AppendChild(refEl);

            // Now, render the use element...
            var refElement            = useElement?.FirstChild;
            IElementVisitorTarget evt = refElement as IElementVisitorTarget;

            if (evt != null)
            {
                evt.Accept(this);
            }

            useElement.RemoveChild(refEl);
            useElement.RestoreReferencedElement(refEl);
            if (!isImported)
            {
                refElParent.AppendChild(refEl);
            }
            useElement.OwnerDocument.Static = false;
        }
Esempio n. 2
0
        public void Accept(IElementVisitor visitor)
        {
            visitor.Visit(this);

            if (this.HasChildNodes)
            {
                visitor.BeginContainer(this);
                foreach (var item in this.ChildNodes)
                {
                    IElementVisitorTarget evt = item as IElementVisitorTarget;
                    if (evt != null)
                    {
                        evt.Accept(visitor);
                    }
                }
                visitor.EndContainer(this);
            }
        }