Example #1
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public IEnumerator <IDirective> GetEnumerator()
        {
            var dirs = new Directives();
            var node = this.node.Value();

            if (node.NodeType == XmlNodeType.Element)
            {
                var elmnt = node as XElement;
                dirs.Add(elmnt.Name);
                foreach (XAttribute attr in elmnt.Attributes())
                {
                    dirs.Attr(attr.Name, attr.Value);
                }
            }

            var ctn = node as XContainer;
            //@TODO: Add failing for null

            var containsElement =
                new Contains <XmlNodeType>(
                    new Mapped <XNode, XmlNodeType>(
                        xnode => xnode.NodeType,
                        ctn.Nodes()
                        ),
                    XmlNodeType.Element
                    ).Value();

            foreach (XNode child in ctn.Nodes())
            {
                switch (child.NodeType)
                {
                case XmlNodeType.Text:
                    if (!containsElement)
                    {
                        dirs.Set((child as XText).Value);
                    }
                    break;

                case XmlNodeType.CDATA:
                    if (!containsElement)
                    {
                        dirs.Set((child as XCData).Value);
                    }
                    break;

                case XmlNodeType.Element:
                    dirs.Append(new CopyOfDirective(child)).Up();
                    break;

                case XmlNodeType.ProcessingInstruction:
                    dirs.Pi((child as XProcessingInstruction).Target, (child as XProcessingInstruction).Data);
                    break;

                case XmlNodeType.Attribute:
                case XmlNodeType.Comment:
                case XmlNodeType.Document:
                case XmlNodeType.DocumentFragment:
                case XmlNodeType.DocumentType:
                    break;

                default:
                    throw new ArgumentException($"unsupported type {child.NodeType} of node {child.ToString()}");
                }
            }

            return(dirs.GetEnumerator());
        }