From 15d9104f2c964e3cdb4a51eafabd5f3da2f10d4f Mon Sep 17 00:00:00 2001 From: Xiao YiFang Date: Thu, 19 May 2022 20:28:52 +0800 Subject: [PATCH] fix : fulltext search will crash close issue #69 --- articleview.cc | 57 +++++++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/articleview.cc b/articleview.cc index 06fba01b..665bfd37 100644 --- a/articleview.cc +++ b/articleview.cc @@ -2482,34 +2482,6 @@ void ArticleView::highlightFTSResults() { closeSearch(); - const QUrl & url = ui.definition->url(); - - bool ignoreDiacritics = Utils::Url::hasQueryItem( url, "ignore_diacritics" ); - - QString regString = Utils::Url::queryItemValue( url, "regexp" ); - if( ignoreDiacritics ) - regString = gd::toQString( Folding::applyDiacriticsOnly( gd::toWString( regString ) ) ); - else - regString = regString.remove( AccentMarkHandler::accentMark() ); - - QRegularExpression regexp; - if( Utils::Url::hasQueryItem( url, "wildcards" ) ) - regexp.setPattern( wildcardsToRegexp( regString ) ); - else - regexp.setPattern( regString ); - - QRegularExpression::PatternOptions patternOptions = - QRegularExpression::DotMatchesEverythingOption | QRegularExpression::UseUnicodePropertiesOption | - QRegularExpression::MultilineOption | QRegularExpression::InvertedGreedinessOption; - if( !Utils::Url::hasQueryItem( url, "matchcase" ) ) - patternOptions |= QRegularExpression::CaseInsensitiveOption; - regexp.setPatternOptions( patternOptions ); - - if( regexp.pattern().isEmpty() || !regexp.isValid() ) - return; - - sptr< AccentMarkHandler > marksHandler = ignoreDiacritics ? new DiacriticsHandler : new AccentMarkHandler; - // Clear any current selection if( ui.definition->selectedText().size() ) { @@ -2519,6 +2491,33 @@ void ArticleView::highlightFTSResults() ui.definition->page()->toPlainText( [ & ]( const QString pageText ) { + const QUrl & url = ui.definition->url(); + + bool ignoreDiacritics = Utils::Url::hasQueryItem( url, "ignore_diacritics" ); + + QString regString = Utils::Url::queryItemValue( url, "regexp" ); + if( ignoreDiacritics ) + regString = gd::toQString( Folding::applyDiacriticsOnly( gd::toWString( regString ) ) ); + else + regString = regString.remove( AccentMarkHandler::accentMark() ); + + QRegularExpression regexp; + if( Utils::Url::hasQueryItem( url, "wildcards" ) ) + regexp.setPattern( wildcardsToRegexp( regString ) ); + else + regexp.setPattern( regString ); + + QRegularExpression::PatternOptions patternOptions = + QRegularExpression::DotMatchesEverythingOption | QRegularExpression::UseUnicodePropertiesOption | + QRegularExpression::MultilineOption | QRegularExpression::InvertedGreedinessOption; + if( !Utils::Url::hasQueryItem( url, "matchcase" ) ) + patternOptions |= QRegularExpression::CaseInsensitiveOption; + regexp.setPatternOptions( patternOptions ); + + if( regexp.pattern().isEmpty() || !regexp.isValid() ) + return; + sptr< AccentMarkHandler > marksHandler = ignoreDiacritics ? new DiacriticsHandler : new AccentMarkHandler; + marksHandler->setText( pageText ); QRegularExpressionMatchIterator it = regexp.globalMatch( marksHandler->normalizedText() ); @@ -2547,7 +2546,7 @@ void ArticleView::highlightFTSResults() ftsSearchMatchCase = Utils::Url::hasQueryItem( url, "matchcase" ); - QWebEnginePage::FindFlags flags( 0 ); + QWebEnginePage::FindFlags flags( QWebEnginePage::FindBackward ); if( ftsSearchMatchCase ) flags |= QWebEnginePage::FindCaseSensitively;