bool CPluginFilter::AddFilterElementHide(std::wstring filterText) { DEBUG_FILTER(L"Input: " + filterText + L" filterFile" + filterFile); CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); { // Create filter descriptor std::auto_ptr<CFilterElementHide> filter; wchar_t separatorChar; do { auto chunkEnd = filterText.find_first_of(L"+>"); if (chunkEnd != std::wstring::npos && chunkEnd > 0) { separatorChar = filterText[chunkEnd]; } else { chunkEnd = filterText.length(); separatorChar = L'\0'; } std::auto_ptr<CFilterElementHide> filterParent(filter); filter.reset(new CFilterElementHide(TrimStringRight(filterText.substr(0, chunkEnd)))); if (filterParent.get() != 0) { filter->m_predecessor.reset(filterParent.release()); } if (separatorChar != L'\0') // complex selector { filterText = TrimStringLeft(filterText.substr(chunkEnd + 1)); if (separatorChar == '+') filter->m_type = CFilterElementHide::TRAVERSER_TYPE_IMMEDIATE; else if (separatorChar == '>') filter->m_type = CFilterElementHide::TRAVERSER_TYPE_PARENT; } else // Terminating element (simple selector) { if (!filter->m_tagId.empty()) { m_elementHideTagsId.insert(std::make_pair(std::make_pair(filter->m_tag, filter->m_tagId), *filter)); } else if (!filter->m_tagClassName.empty()) { m_elementHideTagsClass.insert(std::make_pair(std::make_pair(filter->m_tag, filter->m_tagClassName), *filter)); } else { m_elementHideTags.insert(std::make_pair(filter->m_tag, *filter)); } } } while (separatorChar != '\0'); } return true; }
bool CPluginFilter::AddFilterElementHide(CString filterText) { DEBUG_FILTER("Input: " + filterText + " filterFile" + filterFile); CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); { CString filterString = filterText; // Create filter descriptor std::auto_ptr<CFilterElementHide> filter; CString wholeFilterString = filterString; wchar_t separatorChar; do { int chunkEnd = filterText.FindOneOf(L"+>"); if (chunkEnd > 0) { separatorChar = filterText.GetAt(chunkEnd); } else { chunkEnd = filterText.GetLength(); separatorChar = L'\0'; } CString filterChunk = filterText.Left(chunkEnd).TrimRight(); std::auto_ptr<CFilterElementHide> filterParent(filter); filter.reset(new CFilterElementHide(filterChunk)); if (filterParent.get() != 0) { filter->m_predecessor.reset(filterParent.release()); } if (separatorChar != L'\0') // complex selector { filterText = filterText.Mid(chunkEnd + 1).TrimLeft(); if (separatorChar == '+') filter->m_type = CFilterElementHide::TRAVERSER_TYPE_IMMEDIATE; else if (separatorChar == '>') filter->m_type = CFilterElementHide::TRAVERSER_TYPE_PARENT; } else // Terminating element (simple selector) { if (!filter->m_tagId.IsEmpty()) { m_elementHideTagsId.insert(std::make_pair(std::make_pair(filter->m_tag, filter->m_tagId), *filter)); } else if (!filter->m_tagClassName.IsEmpty()) { m_elementHideTagsClass.insert(std::make_pair(std::make_pair(filter->m_tag, filter->m_tagClassName), *filter)); } else { std::pair<CString, CFilterElementHide> pair = std::make_pair(filter->m_tag, *filter); m_elementHideTags.insert(pair); } } } while (separatorChar != '\0'); } return true; }