Skip to content

Commit

Permalink
Merge branch 'devel'
Browse files Browse the repository at this point in the history
# Conflicts:
#	src/AngleSharp.XPath.Tests/AngleSharp.XPath.Tests.csproj
#	src/AngleSharp.XPath/AngleSharp.XPath.csproj
  • Loading branch information
denis-ivanov committed Jun 1, 2022
2 parents 704a8c9 + 36bd900 commit 488c608
Show file tree
Hide file tree
Showing 4 changed files with 138 additions and 31 deletions.
12 changes: 6 additions & 6 deletions src/AngleSharp.XPath.Tests/AngleSharp.XPath.Tests.csproj
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<PackageReference Include="AngleSharp.Xml" Version="0.14.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
<PackageReference Include="NUnit" Version="3.12.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.16.1" />
<PackageReference Include="AngleSharp.Xml" Version="0.17.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
<PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AngleSharp.XPath\AngleSharp.XPath.csproj" />
</ItemGroup>
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
</Project>
</Project>
74 changes: 74 additions & 0 deletions src/AngleSharp.XPath.Tests/HtmlDocumentNavigatorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
using AngleSharp.Html.Parser;
using NUnit.Framework;
using System.Threading.Tasks;
using System.Xml.XPath;
using AngleSharp.Dom;

namespace AngleSharp.XPath.Tests
{
Expand Down Expand Up @@ -99,5 +101,77 @@ public void SelectSingleNode_DontIgnoreNamespaces_ShouldReturnNode()
Assert.IsNotNull(node);
Assert.That(node.NodeName, Is.EqualTo("xhtml:link"));
}

[Test]
public void SelectNodes_CanReturnAttribute()
{
// Arrange
var html = "<!DOCTYPE html><html><body><div class=\"one\"><span class=\"two\">hello world</span></div></body></html>";
var parser = new HtmlParser();
var doc = parser.ParseDocument(html);

// Act
var nodes = doc.DocumentElement.SelectNodes("//@*");

// Assert
Assert.IsNotNull(nodes);
Assert.That(nodes, Has.Count.EqualTo(2));
Assert.That(nodes, Is.All.InstanceOf<Dom.IAttr>());
}

[Test]
public void TestNameXPathFunctionOnXMLDoc()
{
// Arrange
var xml = @"<html><head><title>Test</title></head><body><h1>Test</h1></body></html>";
var angleSharpXmlDoc = new XmlParser().ParseDocument(xml);

// Act
var xmlNav = angleSharpXmlDoc.CreateNavigator();

// Assert
Assert.AreEqual(TagNames.Html, xmlNav.Evaluate("name()"));
}

[Test]
public void TestNameXPathFunctionOnHTMLDoc()
{
// Arrange
var html = @"<html><head><title>Test</title></head><body><h1>Test</h1></body></html>";

var angleSharpHtmlDoc = new HtmlParser().ParseDocument(html);

// Act
var htmlNav = angleSharpHtmlDoc.CreateNavigator();

// Assert
Assert.AreEqual(TagNames.Html, htmlNav.Evaluate("name()"));
}

[Test]
public void MoveToParent_CallWhenCurrentNodeIsAttr_ShouldBeMovedToAttrOwnerElement()
{
// Arrange
var xml = @"<root att1='value 1' att2='value 2'><child>foo</child></root>";
var parser = new XmlParser();
var doc = parser.ParseDocument(xml);
var nav = doc.CreateNavigator(false);
nav.MoveToChild("root", "");

// Act

if (nav.MoveToFirstAttribute())
{
do
{
Assert.AreEqual(nav.NodeType, XPathNodeType.Attribute);
}
while (nav.MoveToNextAttribute());
nav.MoveToParent();
}

// Assert
Assert.AreEqual(nav.Name, "root");
}
}
}
15 changes: 10 additions & 5 deletions src/AngleSharp.XPath/AngleSharp.XPath.csproj
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Version>1.1.7</Version>
<Version>2.0.0</Version>
<AssemblyVersion>2.0.0</AssemblyVersion>
<FileVersion>2.0.0</FileVersion>
<Authors>Denis Ivanov</Authors>
<PackageId>AngleSharp.XPath</PackageId>
<AssemblyVersion>1.1.7</AssemblyVersion>
<AssemblyName>AngleSharp.XPath</AssemblyName>
<RootNamespace>AngleSharp.XPath</RootNamespace>
<TargetFramework>netstandard2.0</TargetFramework>
<FileVersion>1.1.7</FileVersion>
<TargetFrameworks>netstandard2.0;net461;net472;net6.0</TargetFrameworks>
<Description>XPath support for AngleSharp</Description>
<PackageProjectUrl>https://github.com/AngleSharp/AngleSharp.XPath/</PackageProjectUrl>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
Expand All @@ -16,10 +16,15 @@
<AssemblyOriginatorKeyFile>Key.snk</AssemblyOriginatorKeyFile>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PublicSign>True</PublicSign>
<PackageIconUrl>https://raw.githubusercontent.com/AngleSharp/AngleSharp.XPath/master/logo.png</PackageIconUrl>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="AngleSharp" Version="0.14.0" />
<PackageReference Include="AngleSharp" Version="0.17.0" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'net461' or '$(TargetFramework)' == 'net472' or '$(TargetFramework)' == 'net6.0' ">
<PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" />
</ItemGroup>

<PropertyGroup Condition=" '$(OS)' == 'Windows_NT' ">
Expand Down
68 changes: 48 additions & 20 deletions src/AngleSharp.XPath/HtmlDocumentNavigator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ public class HtmlDocumentNavigator : XPathNavigator
{
private readonly IDocument _document;
private INode _currentNode;
private int _attrIndex;
private readonly bool _ignoreNamespaces;

/// <summary>
Expand All @@ -24,7 +23,6 @@ public HtmlDocumentNavigator(IDocument document, INode currentNode, bool ignoreN
_document = document ?? throw new ArgumentNullException(nameof(document));
NameTable = new NameTable();
_currentNode = currentNode ?? throw new ArgumentNullException(nameof(currentNode));
_attrIndex = -1;
_ignoreNamespaces = ignoreNamespaces;
}

Expand All @@ -49,15 +47,28 @@ public HtmlDocumentNavigator(IDocument document, INode currentNode, bool ignoreN

/// <inheritdoc />
public override string LocalName =>
_attrIndex != -1
? NameTable.GetOrAdd(CurrentElement.Attributes[_attrIndex].LocalName)
CurrentNode is IAttr attr
? attr.LocalName
: NameTable.GetOrAdd(CurrentNode is IElement e ? e.LocalName : string.Empty);

/// <inheritdoc />
public override string Name =>
_attrIndex != -1
? NameTable.GetOrAdd(CurrentElement.Attributes[_attrIndex].Name)
: NameTable.GetOrAdd(_currentNode.NodeName);
public override string Name
{
get
{
if (CurrentNode is IAttr attr)
{
return NameTable.GetOrAdd(attr.Name);
}

if (CurrentElement != null)
{
return NameTable.GetOrAdd(CurrentElement.LocalName);
}

return NameTable.GetOrAdd(_currentNode.NodeName);
}
}

/// <inheritdoc />
public override string NamespaceURI
Expand All @@ -69,16 +80,16 @@ public override string NamespaceURI
return string.Empty;
}

return _attrIndex != -1
? NameTable.GetOrAdd(CurrentElement.Attributes[_attrIndex].NamespaceUri ?? string.Empty)
return CurrentNode is IAttr attr
? NameTable.GetOrAdd(attr.NamespaceUri ?? string.Empty)
: NameTable.GetOrAdd(CurrentElement?.NamespaceUri ?? string.Empty);
}
}

/// <inheritdoc />
public override string Prefix =>
_attrIndex != 1
? NameTable.GetOrAdd(CurrentElement.Attributes[_attrIndex].Prefix ?? string.Empty)
CurrentNode is IAttr attr
? NameTable.GetOrAdd(attr.Prefix ?? string.Empty)
: NameTable.GetOrAdd(CurrentElement?.Prefix ?? string.Empty);

/// <inheritdoc />
Expand Down Expand Up @@ -107,7 +118,7 @@ public override XPathNodeType NodeType
return XPathNodeType.Element;

case Dom.NodeType.Element:
return _attrIndex != -1 ? XPathNodeType.Attribute : XPathNodeType.Element;
return XPathNodeType.Element;

case Dom.NodeType.ProcessingInstruction:
return XPathNodeType.ProcessingInstruction;
Expand Down Expand Up @@ -155,7 +166,7 @@ public override string Value
return documentType.Name;

case Dom.NodeType.Element:
return _attrIndex != -1 ? CurrentElement.Attributes[_attrIndex].Value : _currentNode.TextContent;
return _currentNode.TextContent;

case Dom.NodeType.Entity:
return _currentNode.TextContent;
Expand Down Expand Up @@ -207,7 +218,6 @@ public override bool MoveTo(XPathNavigator other)
if (navigator._document == _document)
{
_currentNode = navigator._currentNode;
_attrIndex = navigator._attrIndex;
return true;
}

Expand All @@ -218,8 +228,8 @@ public override bool MoveTo(XPathNavigator other)
public override bool MoveToFirstAttribute()
{
if (HasAttributes)
{
_attrIndex = 0;
{
_currentNode = CurrentElement.Attributes[0];
return true;
}

Expand Down Expand Up @@ -278,12 +288,24 @@ public override bool MoveToNextAttribute()
return false;
}

if (_attrIndex >= CurrentElement.Attributes.Length - 1)
if (!(CurrentNode is IAttr attr))
{
return false;
}

if (attr.OwnerElement == null)
{
return false;
}

var attrIndex = attr.OwnerElement.Attributes.Index(attr);

if (attrIndex >= CurrentElement.Attributes.Length - 1)
{
return false;
return false;
}

_attrIndex++;
_currentNode = attr.OwnerElement.Attributes[attrIndex + 1];
return true;
}

Expand All @@ -296,6 +318,12 @@ public override bool MoveToNextNamespace(XPathNamespaceScope namespaceScope)
/// <inheritdoc />
public override bool MoveToParent()
{
if (CurrentNode is IAttr attr)
{
_currentNode = attr.OwnerElement;
return true;
}

if (_currentNode.Parent == null)
{
return false;
Expand Down

0 comments on commit 488c608

Please sign in to comment.