예제 #1
0
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;
}
예제 #2
0
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;
}