+ // check if it is same page with different anchor:
+ if (m_LastPage != NULL)
+ {
+ wxChar *p1, *p2;
+ for (p1 = thepage, p2 = m_LastPage;
+ *p1 != 0 && *p1 != _T('#') && *p1 == *p2; p1++, p2++) {}
+
+ m_LastPage = thepage;
+
+ if (*p1 == 0 || *p1 == _T('#'))
+ return FALSE;
+ }
+ else m_LastPage = thepage;
+
+ wxFileSystem fsys;
+ file = fsys.OpenFile(m_Data->m_Contents[i].m_Book->GetFullPath(thepage));
+ if (file)
+ {
+ if (m_Engine.Scan(*file))
+ {
+ m_Name = m_Data->m_Contents[i].m_Name;
+ m_ContentsItem = m_Data->m_Contents + i;
+ found = TRUE;
+ }
+ delete file;
+ }
+ return found;
+}
+
+
+
+
+
+
+
+
+//--------------------------------------------------------------------------------
+// wxHtmlSearchEngine
+//--------------------------------------------------------------------------------
+
+void wxHtmlSearchEngine::LookFor(const wxString& keyword, bool case_sensitive, bool whole_words_only)
+{
+ m_CaseSensitive = case_sensitive;
+ m_WholeWords = whole_words_only;
+ if (m_Keyword) delete[] m_Keyword;
+ m_Keyword = new wxChar[keyword.Length() + 1];
+ wxStrcpy(m_Keyword, keyword.c_str());
+
+ if (!m_CaseSensitive)
+ {
+ for (int i = wxStrlen(m_Keyword) - 1; i >= 0; i--)
+ {
+ if ((m_Keyword[i] >= wxT('A')) && (m_Keyword[i] <= wxT('Z')))
+ m_Keyword[i] += wxT('a') - wxT('A');
+ }
+ }
+}
+
+
+static inline bool WHITESPACE(wxChar c)
+{
+ return c == _T(' ') || c == _T('\n') || c == _T('\r') || c == _T('\t');
+}
+
+bool wxHtmlSearchEngine::Scan(const wxFSFile& file)
+{
+ wxASSERT_MSG(m_Keyword != NULL, wxT("wxHtmlSearchEngine::LookFor must be called before scanning!"));
+
+ int i, j;
+ int wrd = wxStrlen(m_Keyword);
+ bool found = FALSE;
+ wxHtmlFilterHTML filter;
+ wxString tmp = filter.ReadFile(file);
+ int lng = tmp.length();
+ const wxChar *buf = tmp.c_str();
+
+ if (!m_CaseSensitive)
+ for (i = 0; i < lng; i++)
+ tmp[(size_t)i] = (wxChar)wxTolower(tmp[(size_t)i]);
+
+ if (m_WholeWords)
+ {
+ for (i = 0; i < lng - wrd; i++)
+ {
+ if (WHITESPACE(buf[i])) continue;
+ j = 0;
+ while ((j < wrd) && (buf[i + j] == m_Keyword[j])) j++;
+ if (j == wrd && WHITESPACE(buf[i + j])) { found = TRUE; break; }
+ }
+ }
+
+ else
+ {
+ for (i = 0; i < lng - wrd; i++)
+ {
+ j = 0;
+ while ((j < wrd) && (buf[i + j] == m_Keyword[j])) j++;
+ if (j == wrd) { found = TRUE; break; }
+ }
+ }
+