internal AttributeWrapper(GumboAttribute attribute, ElementWrapper parent, int index, Action <string, ElementWrapper> addElementWithId) { if (parent == null) { throw new ArgumentNullException("parent"); } if (addElementWithId == null) { throw new ArgumentNullException("addElementWithId"); } Parent = parent; Index = index; Name = NativeUtf8Helper.StringFromNativeUtf8(attribute.name); Value = NativeUtf8Helper.StringFromNativeUtf8(attribute.value); OriginalName = NativeUtf8Helper.StringFromNativeUtf8(attribute.original_name.data, (int)attribute.original_name.length); OriginalValue = NativeUtf8Helper.StringFromNativeUtf8(attribute.original_value.data, (int)attribute.original_value.length); NameStart = attribute.name_start; NameEnd = attribute.name_end; ValueStart = attribute.value_start; ValueEnd = attribute.value_end; Namespace = attribute.attr_namespace; if (String.Equals(this.Name, "id", StringComparison.OrdinalIgnoreCase)) { addElementWithId(this.Value, parent); } }
internal ElementWrapper(GumboElementNode node, NodeWrapper parent, WrapperFactory factory) : base(node, parent) { _Children = factory.CreateDisposalAwareLazy(() => ImmutableArray.CreateRange(node.GetChildren().OrderBy(x => x.index_within_parent).Select(x => factory.CreateNodeWrapper(x, this)))); _Attributes = factory.CreateDisposalAwareLazy(() => ImmutableArray.CreateRange(node.GetAttributes().Select(x => factory.CreateAttributeWrapper(x, this)))); _Value = factory.CreateDisposalAwareLazy(() => string.Concat(Children.Select(x => x is ElementWrapper ? ((ElementWrapper)x).Value : ((TextWrapper)x).Value))); StartPosition = node.element.start_pos; EndPosition = node.element.end_pos; Tag = node.element.tag; TagNamespace = node.element.tag_namespace; OriginalTag = NativeUtf8Helper.StringFromNativeUtf8( node.element.original_tag.data, (int)node.element.original_tag.length); OriginalTagName = GetTagNameFromOriginalTag(node.element); OriginalEndTag = NativeUtf8Helper.StringFromNativeUtf8( node.element.original_end_tag.data, (int)node.element.original_end_tag.length); NormalizedTagName = NativeUtf8Helper.StringFromNativeUtf8( NativeMethods.gumbo_normalized_tagname(node.element.tag)); }
internal DocumentWrapper(GumboDocumentNode node, WrapperFactory factory) : base(node, null) { _Children = factory.CreateDisposalAwareLazy(() => ImmutableArray.CreateRange(node.GetChildren().OrderBy(x => x.index_within_parent).Select(x => factory.CreateNodeWrapper(x, this)))); HasDocType = node.document.has_doctype; Name = NativeUtf8Helper.StringFromNativeUtf8(node.document.name); PublicIdentifier = NativeUtf8Helper.StringFromNativeUtf8(node.document.public_identifier); SystemIdentifier = NativeUtf8Helper.StringFromNativeUtf8(node.document.system_identifier); DocTypeQuirksMode = node.document.doc_type_quirks_mode; }
internal DocumentWrapper(GumboDocumentNode node, DisposalAwareLazyFactory lazyFactory, Action <string, ElementWrapper> addElementWithId) : base(node, null) { _Children = lazyFactory.Create <IEnumerable <ElementWrapper> >(() => { return(node.GetChildren().Select(x => new ElementWrapper((GumboElementNode)x, this, lazyFactory, addElementWithId)).ToList().AsReadOnly()); }); HasDocType = node.document.has_doctype; Name = NativeUtf8Helper.StringFromNativeUtf8(node.document.name); PublicIdentifier = NativeUtf8Helper.StringFromNativeUtf8(node.document.public_identifier); SystemIdentifier = NativeUtf8Helper.StringFromNativeUtf8(node.document.system_identifier); DocTypeQuirksMode = node.document.doc_type_quirks_mode; }
internal AttributeWrapper(GumboAttribute attribute, ElementWrapper parent) { if (parent == null) { throw new ArgumentNullException(nameof(parent)); } Parent = parent; Name = NativeUtf8Helper.StringFromNativeUtf8(attribute.name); Value = NativeUtf8Helper.StringFromNativeUtf8(attribute.value); OriginalName = NativeUtf8Helper.StringFromNativeUtf8(attribute.original_name.data, (int)attribute.original_name.length); OriginalValue = NativeUtf8Helper.StringFromNativeUtf8(attribute.original_value.data, (int)attribute.original_value.length); NameStart = attribute.name_start; NameEnd = attribute.name_end; ValueStart = attribute.value_start; ValueEnd = attribute.value_end; Namespace = attribute.attr_namespace; }
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: 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 NotSupportedException(String.Format("Unknown node type '{0}'", (int)node.type)); } }
internal ElementWrapper(GumboElementNode node, NodeWrapper parent, DisposalAwareLazyFactory lazyFactory, Action <string, ElementWrapper> addElementWithId) : base(node, parent) { _Children = lazyFactory.Create <IEnumerable <NodeWrapper> >(() => { return(node.GetChildren().Select(x => x is GumboElementNode ? (NodeWrapper) new ElementWrapper((GumboElementNode)x, this, lazyFactory, addElementWithId) : (NodeWrapper) new TextWrapper((GumboTextNode)x, this)).ToList().AsReadOnly()); }); _Attributes = lazyFactory.Create <IEnumerable <AttributeWrapper> >(() => { return(node.GetAttributes().Select((x, i) => new AttributeWrapper(x, this, i, addElementWithId)).ToList()); }); _Value = lazyFactory.Create <string>(() => { return(String.Concat(this.Children.Select(x => x is ElementWrapper ? ((ElementWrapper)x).Value : ((TextWrapper)x).Text))); }); StartPosition = node.element.start_pos; EndPosition = node.element.end_pos; Tag = node.element.tag; TagNamespace = node.element.tag_namespace; OriginalTag = NativeUtf8Helper.StringFromNativeUtf8( node.element.original_tag.data, (int)node.element.original_tag.length); OriginalTagName = GetTagNameFromOriginalTag(node.element); OriginalEndTag = NativeUtf8Helper.StringFromNativeUtf8( node.element.original_end_tag.data, (int)node.element.original_end_tag.length); NormalizedTagName = NativeUtf8Helper.StringFromNativeUtf8( NativeMethods.gumbo_normalized_tagname(node.element.tag)); }
internal TextWrapper(GumboTextNode node, NodeWrapper parent) : base(node, parent) { Text = NativeUtf8Helper.StringFromNativeUtf8(node.text.text); StartPosition = node.text.start_pos; }
public static string MarshalToString(this GumboStringPiece stringPiece) { return(NativeUtf8Helper.StringFromNativeUtf8(stringPiece.data, (int)stringPiece.length)); }