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; }
void TrimString(std::wstring &str, const std::wstring &strWhitespace) { TrimStringLeft(str, strWhitespace); TrimStringRight(str, strWhitespace); }