private static XNode CreateXNode(GumboNode node)
 {
     switch (node.type)
     {
         case GumboNodeType.GUMBO_NODE_DOCUMENT:
             var docNode = (GumboDocumentNode)node;
             return new XDocument(docNode.GetChildren().Select(x => CreateXNode(x)));
         case GumboNodeType.GUMBO_NODE_ELEMENT:
         case GumboNodeType.GUMBO_NODE_TEMPLATE:
             var elementNode = (GumboElementNode)node;
             string elementName = GetName(elementNode.element.tag);
             var attributes = elementNode.GetAttributes().Select(x => new XAttribute(
                 NativeUtf8Helper.StringFromNativeUtf8(x.name),
                 NativeUtf8Helper.StringFromNativeUtf8(x.value)));
             var children = elementNode.GetChildren().Select(x => CreateXNode(x));
             return new XElement(elementName, attributes, children);
         case GumboNodeType.GUMBO_NODE_TEXT:
             var textNode = (GumboTextNode)node;
             return new XText(NativeUtf8Helper.StringFromNativeUtf8(textNode.text.text));
         case GumboNodeType.GUMBO_NODE_CDATA:
             var cDataNode = (GumboTextNode)node;
             return new XCData(NativeUtf8Helper.StringFromNativeUtf8(cDataNode.text.text));
         case GumboNodeType.GUMBO_NODE_COMMENT:
             var commentNode = (GumboTextNode)node;
             return new XComment(NativeUtf8Helper.StringFromNativeUtf8(commentNode.text.text));
         case GumboNodeType.GUMBO_NODE_WHITESPACE:
             var spaceNode = (GumboTextNode)node;
             return new XText(NativeUtf8Helper.StringFromNativeUtf8(spaceNode.text.text));
         default:
             throw new NotImplementedException($"Node type '{node.type}' is not implemented");
     }
 }
Esempio n. 2
0
 public NodeWrapper(GumboNode node, NodeWrapper parent)
 {
     Type       = node.type;
     Index      = (int)node.index_within_parent;
     ParseFlags = node.parse_flags;
     Parent     = parent;
 }
Esempio n. 3
0
        public NodeWrapper CreateNodeWrapper(GumboNode node, NodeWrapper parent = null)
        {
            switch (node.type)
            {
            case GumboNodeType.GUMBO_NODE_DOCUMENT:
                return(new DocumentWrapper((GumboDocumentNode)node, this));

            case GumboNodeType.GUMBO_NODE_ELEMENT:
            case GumboNodeType.GUMBO_NODE_TEMPLATE:
                return(new ElementWrapper((GumboElementNode)node, parent, this));

            case GumboNodeType.GUMBO_NODE_TEXT:
            case GumboNodeType.GUMBO_NODE_CDATA:
            case GumboNodeType.GUMBO_NODE_COMMENT:
            case GumboNodeType.GUMBO_NODE_WHITESPACE:
                return(new TextWrapper((GumboTextNode)node, parent));

            default:
                throw new NotImplementedException($"Node type '{node.type}' is not implemented");
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Dealing with C unions, we need a two-step marshalling to get the actual instance.
        /// </summary>
        /// <param name="nodePointer"></param>
        /// <returns></returns>
        private static GumboNode MarshalToSpecificNode(IntPtr nodePointer)
        {
            GumboNode node = (GumboNode)Marshal.PtrToStructure(nodePointer, typeof(GumboNode));

            switch (node.type)
            {
            case GumboNodeType.GUMBO_NODE_DOCUMENT:
                return(MarshalTo <GumboDocumentNode>(nodePointer));

            case GumboNodeType.GUMBO_NODE_ELEMENT:
                return(MarshalTo <GumboElementNode>(nodePointer));

            case GumboNodeType.GUMBO_NODE_TEXT:
            case GumboNodeType.GUMBO_NODE_CDATA:
            case GumboNodeType.GUMBO_NODE_COMMENT:
            case GumboNodeType.GUMBO_NODE_WHITESPACE:
                return(MarshalTo <GumboTextNode>(nodePointer));

            default:
                throw new NotSupportedException(String.Format("Unknown node type '{0}'", (int)node.type));
            }
        }
Esempio n. 5
0
        private static XNode CreateXNode(GumboNode node)
        {
            switch (node.type)
            {
            case GumboNodeType.GUMBO_NODE_DOCUMENT:
                var docNode = (GumboDocumentNode)node;
                return(new XDocument(docNode.GetChildren().Select(x => CreateXNode(x))));

            case GumboNodeType.GUMBO_NODE_ELEMENT:
            case GumboNodeType.GUMBO_NODE_TEMPLATE:
                var    elementNode = (GumboElementNode)node;
                string elementName = GetName(elementNode.element.tag);
                var    attributes  = elementNode.GetAttributes().Select(x => new XAttribute(
                                                                            NativeUtf8Helper.StringFromNativeUtf8(x.name),
                                                                            NativeUtf8Helper.StringFromNativeUtf8(x.value)));
                var children = elementNode.GetChildren().Select(x => CreateXNode(x));
                return(new XElement(elementName, attributes, children));

            case GumboNodeType.GUMBO_NODE_TEXT:
                var textNode = (GumboTextNode)node;
                return(new XText(NativeUtf8Helper.StringFromNativeUtf8(textNode.text.text)));

            case GumboNodeType.GUMBO_NODE_CDATA:
                var cDataNode = (GumboTextNode)node;
                return(new XCData(NativeUtf8Helper.StringFromNativeUtf8(cDataNode.text.text)));

            case GumboNodeType.GUMBO_NODE_COMMENT:
                var commentNode = (GumboTextNode)node;
                return(new XComment(NativeUtf8Helper.StringFromNativeUtf8(commentNode.text.text)));

            case GumboNodeType.GUMBO_NODE_WHITESPACE:
                var spaceNode = (GumboTextNode)node;
                return(new XText(NativeUtf8Helper.StringFromNativeUtf8(spaceNode.text.text)));

            default:
                throw new NotImplementedException($"Node type '{node.type}' is not implemented");
            }
        }
Esempio n. 6
0
 public NodeWrapper(GumboNode node, NodeWrapper parent)
 {
     Type       = node.type;
     ParseFlags = node.parse_flags;
     Parent     = parent;
 }
Esempio n. 7
0
 public NodeWrapper(GumboNode node, NodeWrapper parent)
 {
     Type = node.type;
     ParseFlags = node.parse_flags;
     Parent = parent;
 }