Fix pronunciation for active article (if not avaialbe, fallback to the first one)

This commit is contained in:
Timon Wong 2013-05-31 11:28:05 +08:00
parent c55a3bd0fc
commit d5c236f183
5 changed files with 48 additions and 36 deletions

View file

@ -118,12 +118,13 @@ std::string ArticleMaker::makeHtmlHeader( QString const & word,
result += "<link rel=\"icon\" type=\"image/png\" href=\"qrcx://localhost/flags/" + Html::escape( icon.toUtf8().data() ) + "\" />\n";
result += "<script type=\"text/javascript\">"
"gdAudioLinks = { first: null, current: null };"
"function gdMakeArticleActive( newId ) {"
"if ( gdCurrentArticle != 'gdfrom-' + newId ) {"
"document.getElementById( gdCurrentArticle ).className = 'gdarticle';"
"document.getElementById( 'gdfrom-' + newId ).className = 'gdarticle gdactivearticle';"
"gdCurrentArticle = 'gdfrom-' + newId; articleview.onJsActiveArticleChanged(gdCurrentArticle);"
"eval( 'gdActivateAudioLink_' + newId + '();' ); } }"
"gdCurrentArticle = 'gdfrom-' + newId; gdAudioLinks.current = newId;"
"articleview.onJsActiveArticleChanged(gdCurrentArticle); } }"
"var overIframeId = null;"
"function gdSelectArticle( id ) {"
"var selection = window.getSelection(); var range = document.createRange();"
@ -465,13 +466,13 @@ void ArticleRequest::bodyFinished()
else
{
// This is the first article
head += "<script language=\"JavaScript\">"
head += "<script type=\"text/javascript\">"
"var gdCurrentArticle=\"" + gdFrom + "\"; "
"articleview.onJsActiveArticleChanged(gdCurrentArticle)</script>";
}
string jsVal = Html::escapeForJavaScript( dictId );
head += "<script language=\"JavaScript\">var gdArticleContents; "
head += "<script type=\"text/javascript\">var gdArticleContents; "
"if ( !gdArticleContents ) gdArticleContents = \"" + jsVal +" \"; "
"else gdArticleContents += \"" + jsVal + " \";</script>";

View file

@ -1108,16 +1108,30 @@ void ArticleView::forward()
bool ArticleView::hasSound()
{
QVariant v = evaluateJavaScriptVariableSafe( ui.definition->page()->mainFrame(), "gdAudioLink" );
QVariant v = ui.definition->page()->mainFrame()->evaluateJavaScript( "gdAudioLinks.first" );
if ( v.type() == QVariant::String )
soundScript = v.toString();
else
soundScript.clear();
return !soundScript.isEmpty();
return !v.toString().isEmpty();
return false;
}
void ArticleView::playSound()
{
QVariant v;
QString soundScript;
v = ui.definition->page()->mainFrame()->evaluateJavaScript( "gdAudioLinks[gdAudioLinks.current]" );
if ( v.type() == QVariant::String )
soundScript = v.toString();
// fallback to the first one
if ( soundScript.isEmpty() )
{
v = ui.definition->page()->mainFrame()->evaluateJavaScript( "gdAudioLinks.first" );
if ( v.type() == QVariant::String )
soundScript = v.toString();
}
if ( !soundScript.isEmpty() )
openLink( QUrl::fromEncoded( soundScript.toUtf8() ), ui.definition->url() );
}

View file

@ -35,7 +35,6 @@ class ArticleView: public QFrame
bool searchIsOpened;
bool expandOptionalParts;
QString articleToJump;
QString soundScript;
/// Any resource we've decided to download off the dictionary gets stored here.
/// Full vector capacity is used for search requests, where we have to make

View file

@ -6,7 +6,7 @@
std::string addAudioLink( std::string const & url,
std::string const & dictionaryId )
{
return std::string( "<script language=\"JavaScript\">" +
return std::string( "<script type=\"text/javascript\">" +
makeAudioLinkScript( url, dictionaryId ) +
"</script>" );
}
@ -33,9 +33,6 @@ std::string makeAudioLinkScript( std::string const & url,
escaped = ( ch == '\\' );
}
return std::string( "var gdAudioLink; "
"if ( !gdAudioLink ) gdAudioLink=" ) + ref +
"; if ( typeof gdActivateAudioLink_" + dictionaryId + " != 'function' ) {"
"eval( 'function gdActivateAudioLink_" + dictionaryId + "() {"
"gdAudioLink=" + ref + "; }' ); }";
return "if ( !gdAudioLinks.first ) { gdAudioLinks.first = " + ref + "; }" +
"gdAudioLinks['" + dictionaryId + "'] = " + ref + ";";
}

View file

@ -2181,6 +2181,7 @@ void MainWindow::dictsListItemActivated( QListWidgetItem * item )
{
QString id = item->data( Qt::UserRole ).toString();
getCurrentArticleView()->jumpToDictionary( id );
updatePronounceAvailability();
}
void MainWindow::dictsListSelectionChanged()