private PageLinksValidationResult ValidatePageLinks(HttpClient client, DocumentationPage page, IList <DocumentationPage> pages) { var result = new PageLinksValidationResult(page.Key, page.Language == Language.All ? _currentLanguage : page.Language, page.Version); var htmlDocument = HtmlHelper.ParseHtml(page.HtmlContent); var links = htmlDocument.DocumentNode.SelectNodes("//a[@href]"); if (links == null) { return(result); } var currentUri = new Uri(_options.RootUrl + page.Key + "/../"); foreach (var link in links) { var hrefAttribute = link.Attributes["href"]; var href = hrefAttribute.Value.Trim(); try { var isValid = false; Uri uri = null; if (string.IsNullOrEmpty(href) == false) { uri = href.StartsWith("http") ? new Uri(href, UriKind.Absolute) : new Uri(currentUri + href, UriKind.Absolute); var indexOfHash = uri.AbsoluteUri.IndexOf("#", StringComparison.InvariantCultureIgnoreCase); if (indexOfHash != -1) { var potentialGuid = uri.AbsoluteUri.Substring(indexOfHash + 1); Guid guid; if (Guid.TryParse(potentialGuid, out guid)) { continue; } } isValid = ValidatePageLink(client, uri); } result.Links[string.Format("[{0}][{1}]", link.InnerText, uri)] = isValid; } catch (Exception) { result.Links[href] = false; } } return(result); }
private PageLinksValidationResult ValidatePageLinks(HttpClient client, DocumentationPage page) { void ValidateLinks(HttpClient httpClient, List <HtmlNode> toValidate, Uri baseUri, PageLinksValidationResult results) { foreach (var link in toValidate) { var hrefAttribute = link.Attributes["href"]; var href = hrefAttribute.Value.Trim(); try { var isValid = false; Uri uri = null; if (string.IsNullOrEmpty(href) == false) { uri = href.StartsWith("http") ? new Uri(href, UriKind.Absolute) : new Uri(baseUri + href, UriKind.Absolute); var indexOfHash = uri.AbsoluteUri.IndexOf("#", StringComparison.InvariantCultureIgnoreCase); if (indexOfHash != -1) { var potentialGuid = uri.AbsoluteUri.Substring(indexOfHash + 1); if (Guid.TryParse(potentialGuid, out Guid _)) { continue; } } isValid = ValidatePageLink(httpClient, uri); } results.Links[$"[{link.InnerText}][{uri}]"] = isValid; } catch (Exception) { results.Links[href] = false; } } } var result = new PageLinksValidationResult(page.Key, page.Language == Language.All ? _currentLanguage : page.Language, page.Version); var htmlDocument = HtmlHelper.ParseHtml(page.HtmlContent); var linksToValidate = new List <HtmlNode>(); var links = htmlDocument.DocumentNode.SelectNodes("//a[@href]"); if (links != null) { linksToValidate.AddRange(links); } if (string.IsNullOrWhiteSpace(page.RelatedArticlesContent) == false) { htmlDocument = HtmlHelper.ParseHtml(page.RelatedArticlesContent); links = htmlDocument.DocumentNode.SelectNodes("//a[@href]"); if (links != null) { linksToValidate.AddRange(links); } } if (linksToValidate.Count == 0) { return(result); } var currentUri = new Uri(_options.RootUrl + page.Key + "/../"); ValidateLinks(client, linksToValidate, currentUri, result); return(result); }