diff --git a/src/common/utils.hh b/src/common/utils.hh index dfa7301e..15a4d35e 100644 --- a/src/common/utils.hh +++ b/src/common/utils.hh @@ -39,6 +39,19 @@ inline QString rstrip( const QString & str ) return {}; } +inline uint32_t leadingSpaceCount( const QString & str ) +{ + for ( int i = 0; i < str.size(); i++ ) { + if ( str.at( i ).isSpace() ) { + continue; + } + else { + return i; + } + } + return 0; +} + std::string c_string( const QString & str ); bool endsWithIgnoreCase( QByteArrayView str, QByteArrayView extension ); /** diff --git a/src/dict/dictserver.cc b/src/dict/dictserver.cc index 2dff23b2..7ca2aad5 100644 --- a/src/dict/dictserver.cc +++ b/src/dict/dictserver.cc @@ -592,12 +592,49 @@ public: cancel(); } ); - connect( this, &DictServerArticleRequest::finishedArticle, this, [ this ]( QString articleText ) { + connect( this, &DictServerArticleRequest::finishedArticle, this, [ this ]( QString _articleText ) { if ( Utils::AtomicInt::loadAcquire( isCancelled ) ) { cancel(); return; } + //modify the _articleText,remove extra lines[start with 15X etc.] + QList< QString > lines = _articleText.split( "\n", Qt::SkipEmptyParts ); + + QString resultStr; + + // process the line + static QRegularExpression leadingRespCode( "^\\d{3} " ); + uint32_t leadingSpaceCount = 0; + uint32_t firstLeadingSpaceCount = 0; + for ( const QString & line : lines ) { + //ignore 15X lines + if ( leadingRespCode.match( line ).hasMatch() ) { + continue; + } + // ignore dot(.),the end line character + if ( line.trimmed() == "." ) { + break; + } + + auto lsc = Utils::leadingSpaceCount( line ); + + if ( firstLeadingSpaceCount == 0 && lsc > firstLeadingSpaceCount ) { + firstLeadingSpaceCount = lsc; + } + + if ( lsc >= leadingSpaceCount && lsc > firstLeadingSpaceCount ) { + //extra space + resultStr.append( " " ); + resultStr.append( line.trimmed() ); + } + else { + resultStr.append( "\n" ); + resultStr.append( line ); + } + leadingSpaceCount = lsc; + } + static QRegularExpression phonetic( R"(\\([^\\]+)\\)", QRegularExpression::CaseInsensitiveOption ); // phonetics: \stuff\ ... static QRegularExpression divs_inside_phonetic( "]*)>]*)>", @@ -610,26 +647,26 @@ public: string articleStr; if ( contentInHtml ) { - articleStr = articleText.toUtf8().data(); + articleStr = resultStr.toUtf8().data(); } else { - articleStr = Html::preformat( articleText.toUtf8().data() ); + articleStr = Html::preformat( resultStr.toUtf8().data() ); } - articleText = QString::fromUtf8( articleStr.c_str(), articleStr.size() ); + _articleText = QString::fromUtf8( articleStr.c_str(), articleStr.size() ); int pos; if ( !contentInHtml ) { - articleText = articleText.replace( refs, R"(\1)" ); + _articleText = _articleText.replace( refs, R"(\1)" ); pos = 0; QString articleNewText; // Handle phonetics - QRegularExpressionMatchIterator it = phonetic.globalMatch( articleText ); + QRegularExpressionMatchIterator it = phonetic.globalMatch( _articleText ); while ( it.hasNext() ) { QRegularExpressionMatch match = it.next(); - articleNewText += articleText.mid( pos, match.capturedStart() - pos ); + articleNewText += _articleText.mid( pos, match.capturedStart() - pos ); pos = match.capturedEnd(); QString phonetic_text = match.captured( 1 ); @@ -638,18 +675,18 @@ public: articleNewText += R"()" + phonetic_text + ""; } if ( pos ) { - articleNewText += articleText.mid( pos ); - articleText = articleNewText; + articleNewText += _articleText.mid( pos ); + _articleText = articleNewText; articleNewText.clear(); } // Handle links pos = 0; - it = links.globalMatch( articleText ); + it = links.globalMatch( _articleText ); while ( it.hasNext() ) { QRegularExpressionMatch match = it.next(); - articleNewText += articleText.mid( pos, match.capturedStart() - pos ); + articleNewText += _articleText.mid( pos, match.capturedStart() - pos ); pos = match.capturedEnd(); QString link = match.captured( 1 ); @@ -663,13 +700,13 @@ public: articleNewText += newLink; } if ( pos ) { - articleNewText += articleText.mid( pos ); - articleText = articleNewText; + articleNewText += _articleText.mid( pos ); + _articleText = articleNewText; articleNewText.clear(); } } - articleData += string( "
" ) + articleText.toUtf8().data() + "
"; + articleData += string( "
" ) + _articleText.toUtf8().data() + "
"; if ( !articleData.empty() ) {