From d7b37a24844a7f6c6af6bff23782ec1ee2827e6f Mon Sep 17 00:00:00 2001 From: David Smith Date: Mon, 26 Jun 2017 01:48:34 -0500 Subject: [PATCH] Rewrite threadmark locating logic again, due to changes in threadmark code. --- .../Input/Forums/Adapters/XenForoAdapter.cs | 53 ++++++++++++------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/NetTally.Core/Input/Forums/Adapters/XenForoAdapter.cs b/NetTally.Core/Input/Forums/Adapters/XenForoAdapter.cs index a0a985ec..42bb9a7c 100644 --- a/NetTally.Core/Input/Forums/Adapters/XenForoAdapter.cs +++ b/NetTally.Core/Input/Forums/Adapters/XenForoAdapter.cs @@ -455,36 +455,49 @@ static IEnumerable GetThreadmarksList(IQuest quest, HtmlDocument page) var threadmarksDiv = content.GetDescendantWithClass("div", "threadmarks"); - HtmlNode mainList = threadmarksDiv.Elements("ol").FirstOrDefault(e => e.HasClass("threadmarkList")); + HtmlNode listOfThreadmarks = null; - if (mainList == null) + HtmlNode threadmarkList = threadmarksDiv.GetDescendantWithClass("threadmarkList"); + + if (threadmarkList != null) { - mainList = threadmarksDiv.Elements("ul").FirstOrDefault(e => e.Elements("li").FirstOrDefault(a => a.HasClass("threadmarkItem")) != null); + // We have a .threadmarkList node. This is either an ol itself, or it will contain a ThreadmarkCategory_# ol node. We want category 1. + + if (threadmarkList.Name == "ol") + { + if (threadmarkList.GetAttributeValue("class", "").Contains("ThreadmarkCategory")) + { + if (!threadmarkList.HasClass("ThreadmarkCategory_1")) + return new List(); + } + + listOfThreadmarks = threadmarkList; + } + else + { + listOfThreadmarks = threadmarkList.GetDescendantWithClass("ol", "ThreadmarkCategory_1"); + } } - - // Return empty list if no threadmark ul or ol found. - if (mainList == null) - return new List(); - - // Ensure that if we have a page with a threadmark category, that it is the primary category. - if (mainList.GetAttributeValue("class", "").Contains("ThreadmarkCategory")) + else { - if (!mainList.HasClass("ThreadmarkCategory_1")) - return new List(); + // threadmarkList was null. There is no .threadmarkList node, so check for undecorated ul that contains .threadmarkItem list items. + listOfThreadmarks = threadmarksDiv.Descendants("ul").FirstOrDefault(e => e.Elements("li").Any(a => a.HasClass("threadmarkItem"))); } + if (listOfThreadmarks != null) + { + Predicate filterLambda = (n) => + (quest.UseCustomThreadmarkFilters && quest.ThreadmarkFilter.Match(n.InnerText)) || + (!quest.UseCustomThreadmarkFilters && DefaultThreadmarkFilter.Match(n.InnerText)); - Predicate filterLambda = (n) => - (quest.UseCustomThreadmarkFilters && quest.ThreadmarkFilter.Match(n.InnerText)) || - (!quest.UseCustomThreadmarkFilters && DefaultThreadmarkFilter.Match(n.InnerText)); - - Func nodeSelector = (n) => n.Element("a"); + Func nodeSelector = (n) => n.Element("a"); - Func> childSelector = (i) => i.Element("ul")?.Elements("li") ?? new List(); + Func> childSelector = (i) => i.Element("ul")?.Elements("li") ?? new List(); - var results = mainList.Elements("li").TraverseList(childSelector, nodeSelector, filterLambda); + var results = listOfThreadmarks.Elements("li").TraverseList(childSelector, nodeSelector, filterLambda); - return results; + return results; + } } catch (ArgumentNullException e) {