bool Filters::FilterText(const Item& item) const { std::vector<std::wstring> words; Split(text, L" ", words); RemoveEmptyStrings(words); std::vector<std::wstring> titles; GetAllTitles(item.GetId(), titles); const auto& genres = item.GetGenres(); for (const auto& word : words) { auto check_strings = [&word](const std::vector<std::wstring>& v) { for (const auto& str : v) { if (InStr(str, word, 0, true) > -1) return true; } return false; }; if (!check_strings(titles) && !check_strings(genres) && InStr(item.GetMyTags(), word, 0, true) == -1) return false; } return true; }
void CChainComparer::CompareTheChains() { // Why are things done in this order?? because it works! This code was once in CRTF_DocumentChainBuilder.cpp - examine the history of that file for more clues! GlobalThenLocalBind(); DuplicateBindBySection(Binder::eDefault, DBG_AFTER_LOCAL_DUPLIC_1); VerifyListsAndFindMoves(); DoSentenceAndClauseComparison(); DecomposeStrings(); ExpandBridges(false, DBG_AFTER_EXPAND_BRIDGE_1); LocalThenGlobalBind(); DuplicateBindBySection(Binder::eDefault, DBG_AFTER_LOCAL_DUPLIC_2); VerifyListsAndFindMoves(); ExpandBridges(false, DBG_AFTER_EXPAND_BRIDGE_2); DisassociateAndDecomposeMoves(); DuplicateBindBySection(Binder::eIncludeMoves, DBG_AFTER_LOCAL_DUPLIC_3); VerifyListsAndFindMoves(); DecomposeWhiteSpaceStrings(); ExpandBridges(false, DBG_AFTER_EXPAND_BRIDGE_3); CHECK_CHAINS(m_pAnchor1, m_pAnchor2); CheckReadabilityAndExpandBridges(true); CHECK_CHAINS(m_pAnchor1, m_pAnchor2); bool bChainsSnipped = BreakBridgesAcrossMatchingTables(); PreCompareTables(); if (OptimizePdfComparison()) { LocalThenGlobalBind(); DuplicateBindBySection(Binder::eDefault, DBG_AFTER_LOCAL_DUPLIC_2); ExpandBridges(false, DBG_AFTER_EXPAND_BRIDGE_2); VerifyListsAndFindMoves(); } WriteRefFilesIfAppropriate(); CompareOptionalArtefacts(); LocalThenGlobalBind(); DoFinalBinding(); m_pAnchor2->FindMoves(m_pAnchor1); CheckReadabilityAndExpandBridges(false); CompareStringContentsIfSelected(); DoSanityChecks(); RemoveEmptyStrings(); MigrateDeletionsIfAppropriate(); }
bool Filters::CheckItem(Item& item) { // Filter my status for (size_t i = 0; i < my_status.size(); i++) if (!my_status.at(i) && item.GetMyStatus() == i) return false; // Filter airing status for (size_t i = 0; i < status.size(); i++) if (!status.at(i) && item.GetAiringStatus() == i + 1) return false; // Filter type for (size_t i = 0; i < type.size(); i++) if (!type.at(i) && item.GetType() == i + 1) return false; // Filter text vector<wstring> words; Split(text, L" ", words); RemoveEmptyStrings(words); for (auto it = words.begin(); it != words.end(); ++it) { if (InStr(item.GetTitle(), *it, 0, true) == -1 && InStr(item.GetGenres(), *it, 0, true) == -1 && InStr(item.GetMyTags(), *it, 0, true) == -1) { bool found = false; for (auto synonym = item.GetSynonyms().begin(); !found && synonym != item.GetSynonyms().end(); ++synonym) if (InStr(*synonym, *it, 0, true) > -1) found = true; if (item.IsInList()) for (auto synonym = item.GetUserSynonyms().begin(); !found && synonym != item.GetUserSynonyms().end(); ++synonym) if (InStr(*synonym, *it, 0, true) > -1) found = true; if (!found) return false; } } // Item passed all filters return true; }